栈的特点是“先进后出”。模拟的思路是:建立一个栈的结构体,里面有两个指针(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;
}
}