栈的模拟

来源:互联网 发布:优酷下载器 mac 编辑:程序博客网 时间:2024/06/15 11:56

栈的特点是“先进后出”。模拟的思路是:建立一个栈的结构体,里面有两个指针(PNODE ptop,PNODE pbutton),分别指向栈的最后一个进入的结点、第一个结点前的一个结点。程序如下图:


/*程序功能:用链表模拟栈
  对栈进行 初始化、压栈、判断空、遍历、出栈、清空操作
*/

#include<stdio.h>
#include<malloc.h>


typedef struct node
{
int data;
struct node *pnext;
} NODE,*PNODE;


typedef struct Stack
{
PNODE ptop;
PNODE pbutton;
} STACK, * PSTACK;


void initstack(PSTACK pstack);
bool push(PSTACK pstack,int val);
bool empty(PSTACK pstack);
bool travel(PSTACK pstack);
bool pop(PSTACK pstack,int *val);
void clear(PSTACK pstack);


int main()
{
int val;
STACK s;
initstack(&s);
push(&s,1);
push(&s,2);
push(&s,3);
push(&s,4);
//printf("ptop地址%d,pbutton地址%d",s.ptop,s.pbutton);
travel(&s);
pop(&s,&val);
printf("删除的结点的值为%d\n",val);
travel(&s);
clear(&s);
    travel(&s);
return 0;
}


//初始化栈
void initstack(PSTACK pstack)
{
pstack->ptop=(PNODE)malloc(sizeof(NODE));
if(pstack->ptop==NULL)
{printf("初始化失败\n");
}
else
{
pstack->pbutton=pstack->ptop;
pstack->ptop->pnext=NULL; //pstack->pbutton->pnext=NULL也可以;
}
}


//压栈
bool push(PSTACK pstack,int val)
{
PNODE pnew=(PNODE)malloc(sizeof(NODE));
pnew->data=val;
pnew->pnext=pstack->ptop;
pstack->ptop=pnew;
    //printf("%d\n",pnew->data);
return true;
}


//判断栈是否为空
bool empty(PSTACK pstack)
{
if(pstack->ptop==pstack->pbutton)
{
printf("栈是空的\n");
return true;
}
else return false;
}


//遍历栈
bool travel(PSTACK pstack)
{
if(empty(pstack))
return false;
else
{
PNODE r=pstack->ptop;
printf("栈里面的值为: ");
while(r!=pstack->pbutton)
{
printf("%d ",r->data);
r=r->pnext;
}
printf("\n");
return true;
}
}


//出栈
bool pop(PSTACK pstack,int *val)
{       
    if(empty(pstack))
return false;
else
{
PNODE q=pstack->ptop;
*val=q->data;
pstack->ptop=q->pnext;
q=NULL;//将指针内容清空
return true;
}
       
}


//清空栈
void clear(PSTACK pstack)
{
 if(empty(pstack))
 return;
 else
 {
PNODE k=pstack->ptop;
PNODE q=NULL;
while(k!=pstack->pbutton)
{   q=k->pnext;
free(k);
k=q;
}
        pstack->ptop=pstack->pbutton;
 }
}



0 0