链栈
链栈是指采用链式存储结构实现的栈。通常链栈用单链表来表示。
存储结构
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStack;
初始化
Status InitStack(LinkStack &S){
//构造一个空栈,栈顶指针置为空
S = NULL;
return OK;
}
入栈
出栈示意图
Status Push(LinkStack &S,ElemType e){
LinkStack p;//定义p
p=new StackNode;//生成新结点
p->data=e;//e赋给新结点的数据域
p->next=S; //新结点插入栈顶
S=p;//修改栈顶指针为p
return OK;
}
出栈
出栈示意图
Status Pop(LinkStack &S,ElemType &e){
LinkStack p;//定义p
if(S==NULL) return ERROR;//栈空
e=S->data;//将栈顶元素赋给e
p=S;//p临时保存栈顶元素以备释放
S=S->next;//修改栈顶指针
delete p;//释放空间
return OK;
}
链栈的简单实现
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStack;
Status InitStack(LinkStack &S){
//构造一个空栈,栈顶指针置为空
S = NULL;
return OK;
}
Status Push(LinkStack &S,ElemType e){
LinkStack p;//定义p
p=new StackNode;//生成新结点
p->data=e;//e赋给新结点的数据域
p->next=S; //新结点插入栈顶
S=p;//修改栈顶指针为p
return OK;
}
Status Pop(LinkStack &S,ElemType &e){
LinkStack p;//定义p
if(S==NULL) return ERROR;//栈空
e=S->data;//将栈顶元素赋给e
p=S;//p临时保存栈顶元素以备释放
S=S->next;//修改栈顶指针
delete p;//释放空间
return OK;
}
ElemType GetTop(LinkStack S){
if(S!=NULL) //栈非空
return S->data;
}
LinkStack S;
int main(void){
int n,x,i,j;
ElemType e;
InitStack(S);
cout<<"链栈简单操作目录:\n"
<<"1.入栈\n"
<<"2.出栈\n"
<<"3.取栈顶元素\n"
<<"4.退出\n";
while(true){
cout<<"请输入目录编号:";
cin>>n;
switch(n){
case 1:cout<<"请输入要入栈的元素的个数:";
cin>>x;
cout<<"请依次输入"<<x<<"个数字: " ;
for(i=1;i<=x;i++){
cin>>e;
Push(S,e);
}break;
case 2:cout<<"请输入要出栈的元素的个数:" ;
cin>>x;
cout<<"出栈元素为:";
for(i=1;i<=x&&S!=NULL;i++){
Pop(S,e);
cout<<e<<" ";
}
cout<<endl;
break;
case 3:if(S==NULL){
cout<<"栈已空"<<endl;break;
}
else{
cout<<"栈顶元素为:";
cout<<GetTop(S)<<endl; break;
}
case 4:exit(0);
}
}
return 0;
}