//链栈的基本操作.cpp
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
#define MAXSIZE 100
typedef int SElemType;
typedef int Status;
//链栈的存储结构
typedef struct StackNode
{
SElemType data;
struct StackNode* next;
}StackNode, * LinkStack;
Status InitStack(LinkStack&); //空栈
Status Push(LinkStack&, SElemType); //入栈
Status Pop(LinkStack&, SElemType&); //出栈
Status GetTop(LinkStack, SElemType&); //读栈顶元素
Status StackTraverse(LinkStack); //遍历
int main()
{
LinkStack S;
int e, a;
if (InitStack(S))
cout << "链栈初始化成功!" << endl;
else
cout << "链栈初始化失败!" << endl;
while (1)
{
cout << "\n【1】入栈 【2】出栈 【3】读栈顶元素 【4】输出栈 【0】退出" << endl;
cout << "请选择要进行的操作:";
cin >> a;
switch (a)
{
case 1:
cout << "请输入入栈元素:";
cin >> e;
if (!Push(S, e))
cout << "入栈失败!" << endl;
else
cout << "元素" << e << "入栈成功!" << endl;
break;
case 2:
if (!Pop(S, e))
cout << "出栈失败!" << endl;
else
cout << "元素" << e << "出栈成功!" << endl;
break;
case 3:
if (!GetTop(S, e))
cout << "读栈顶元素失败!" << endl;
else
cout << "栈顶元素为:" << e << endl;
break;
case 4:
StackTraverse(S);
break;
case 0: return OK;
default:
return OK;
}
}
return 0;
}
//链栈的初始化
Status InitStack(LinkStack& S)
{ //构造一个空栈S,栈顶指针置空
S = NULL;
return OK;
}
//链栈的入栈
Status Push(LinkStack& S, SElemType e)
{ //在栈顶插入元素e,链栈不需要判断栈满
StackNode* p = new StackNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
//链栈的出栈
Status Pop(LinkStack& S, SElemType& e)
{ //删除S的栈顶元素,用e返回其值
if (S == NULL) //判断是否为栈空
return ERROR;
e = S->data;
StackNode* p = S;
S = S->next;
delete p;
return OK;
}
//取链栈的栈顶元素
SElemType GetTop(LinkStack S, SElemType &e)
{ //返回S的栈顶元素,不修改栈顶指针
if (S != NULL) //非栈空时返回
return S->data;
return ERROR;
}
//遍历输出链栈
Status StackTraverse(LinkStack S)
{
StackNode* p = S;
if (p == NULL)
{
cout << "链栈为空!" << endl;
return ERROR;
}
cout << "栈顶->";
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
return OK;
}