#include<bits/stdc++.h>
using namespace std;
struct StackNode //创建链表单元(结点)
{
int data; //数据域
StackNode *next; //指针域
};
StackNode* zero() //初始化链栈
{
StackNode* top=new StackNode; //为栈开辟空间,使top成为链栈的栈顶单元
top->next=NULL; //先指向NULL,防止其成为野指针
return top; //返回链栈的头单元
}
void Push(StackNode* top,int x) //入栈
{
StackNode* p=new StackNode; //为普通单元开辟空间
p->data=x; //将需要入栈的值存入普通单元的数据域
p->next=top->next; //将新节点的下一个指针指向原来栈顶指针的下一个节点
top->next=p; //将栈顶指针的下一个节点指向新节点,完成入栈操作
}
bool Null_(StackNode* top) //判空
{
return (top->next==NULL); //返回top的下一个单元
}
int pop(StackNode* top) //出栈
{
if(Null_(top)) //先进行判空
{
cout<<"栈空"<<endl;
return -1;
}
int e=top->next->data; //将要出栈的数据返回给e
StackNode* p=top->next; //保存要出栈的单元
top->next=p->next; //使top指向下下个单元 (出栈单元的下一个单元)
delete p; // 释放出栈单元的空间
return e; //返回出栈的数据
}
void traverse(StackNode* top) //遍历栈
{
cout<<"当前出栈顺序为:"; //提示
StackNode* p=top->next; //top本身没有数据,需从top的下一个单元开始遍历
while(p!=NULL) //判空
{
cout<<p->data<<" "; //输出出栈数据
p=p->next; //指向下一个元素
}
cout<<endl; //换行使界面更加整洁
}
int main()
{
int i,n,a[100];
StackNode* top=zero(); //c初始化top
cout<<"输入入栈数据的个数: ";
cin>>n;
for(i=0;i<n;i++) //入栈
{
cin>>a[i];
Push(top,a[i]);
}
traverse(top); //遍历栈
cout<<"输入出栈数据个数: ";
cin>>n;
for(i=0;i<n;i++) //出栈
{
cout<<pop(top)<<"出栈";
}
traverse(top); //遍历栈
cout<<"输入入栈数据的个数: ";
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
Push(top,a[i]);
}
traverse(top);
return 0;
}
如下附上运行结果: