栈的链表实现
在刚学习数据结构的时候,我们经常地会用到顺序栈,一个学弟问到我怎样用链表实现栈,下午花了一点时间,好久没有写过这个东西了传上来大家一起交流学习!
/* 日期:2014-3-25 作者:徐刘根 名称:栈的链表实现 环境:VC++ */ #include<iostream.h> typedef struct node { int data; struct node *next; }StackNode,*PStackNode; typedef struct { PStackNode top; }LinkStack,*PLinkStack; PLinkStack Init_LinkStack( )//初始化空栈无入口参数 { PLinkStack S=new LinkStack(); if(S) S->top=NULL; cout<<"初始化成功"<<endl; return(S); } int Empty_LinkStack(PLinkStack S)//判断栈是否为空入口参数:顺序栈,返回值:0表示为空,1表示非空 { if(S->top==NULL) { cout<<"栈是空的"<<endl; return 1; } else { cout<<"栈非空"<<endl; return 0; } } int Push_LinkStack(PLinkStack S,int x)//在栈顶插入一新元素X入口参数为顺序栈返回值:1表示入栈成功0表示失败 { PStackNode p=new StackNode(); if(!p) { cout<<"内存溢出"<<endl; return 0; } p->data=x; p->next=S->top; S->top=p; cout<<"入栈成功,入栈元素为:"<<p->data<<endl; return 1; } int Pop_LinkStack(PLinkStack S,int *x)//删除栈顶元素并保存在*X,入口参数:顺序栈,返回值1表示成功0表示失败 { PStackNode p; if(Empty_LinkStack(S)) { cout<<"栈空,不能出栈"<<endl; return 0; } *x=S->top->data; p=S->top; cout<<"出栈元素为:"<<p->data<<endl; S->top=S->top->next; delete(p); cout<<"出栈成功"<<endl; return 1; } int GetTop_LinkStack(PLinkStack S,int *x)//取出栈顶元素,入口参数:顺序栈,被取出的元素指针。 { if(Empty_LinkStack(S)) { cout<<"栈空"<<endl; return 0; } *x=S->top->data; cout<<"取栈顶元素为:"<<*x<<endl; return 1; } int Bianli_Seqstack(PLinkStack S)//遍历栈入口参数为顺序栈 { if(Empty_LinkStack(S)) { cout<<"栈空,不能出栈"<<endl; return 0; } else { PStackNode p,q; cout<<"栈元素遍历为:"<<endl; if(S) { p=S->top; while(p) { cout<<"--------"<<p->data<<"-------"<<endl; q=p; p=p->next; } } } return 1; } void Destory_LinkStack(PLinkStack *S)//销毁栈入口参数要销毁的顺序栈指针地址 { PStackNode p,q; if(*S) { p=(*S)->top; while(p) { q=p; p=p->next; delete(q); } delete(*S); } *S=NULL; cout<<"栈已经删除了"<<endl; return ; } void main() { PLinkStack S =NULL; int i; cout<<"-------栈的线性表操作------"<<endl; while(true) { cout<<"***************************"<<endl; cout<<"<1>--栈的初始化 <2>--入栈操作 "<<endl; cout<<"<3>--出栈操作 <4>--判断栈是否空"<<endl; cout<<"<5>--取出栈顶元素 <6>--遍历栈 "<<endl; cout<<"<7>--销毁栈 "<<endl; cout<<"请选择您的操作"<<endl; cin>>i; switch(i) { case 1:S=Init_LinkStack(); break; case 2: int x; cout<<"请输入您要插入的元素"<<endl; cin>>x; Push_LinkStack( S,x );break; case 3: Pop_LinkStack( S,&x);break; case 4: Empty_LinkStack(S);break; case 5: GetTop_LinkStack(S,&x);break; case 6: Bianli_Seqstack(S);break; case 7: Destory_LinkStack(&S);break; default: cout<<"输入操作不正确,请重新选择!"<<endl;break; } } }
运行结果如下: