一、顺序栈

  

#include <iostream>
using namespace std;
#define MAXSIZE 100 //栈的最大容量
typedef struct {
int* base;//栈底指针
int* top;//栈顶指针
int stacksize;//栈可用的最大容量
}SqStack; void InitStack(SqStack& S) {
//构造空栈
S.base = new int[MAXSIZE];
if (!S.base) exit(OVERFLOW);//存储分配失败
S.top = S.base;//top初始为base表示为空栈
S.stacksize = MAXSIZE;
} //入栈
bool Push(SqStack& S, int e) {
//插入元素e为新的栈顶元素
if (S.top - S.base == S.stacksize) return false;//栈满
*S.top++ = e;//元素e压入栈顶,栈顶指针加1
return true;
}
//出栈
bool Pop(SqStack& S, int& e) {
//删除S的栈顶元素,用e返回其值
if (S.top == S.base) return false;//top=base表示为空栈,返回NULL
e=*(--S.top);//栈顶指针减1,将栈顶元素赋值给e
return true;
}
//取栈顶元素,返回S的栈顶元素,不修改栈顶指针
int GetTop(SqStack S) {
if (S.top != S.base) return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
return NULL;
}
//判断顺序栈S是否为空栈
bool isEmpty(SqStack S) {
if (S.top!=S.base) return false;//不为空返回fasle
return true;//为空返回true
}
//批量入栈
void StackInput(SqStack& S) {
int value;
cout << "请输入入几次栈:";
cin >> S.stacksize;//用户输入入几次栈
for (int i = 0; i < S.stacksize; i++) {
cout << "请输入第" << i + 1 << "个值:";
cin >> value;
if (Push(S, value)) cout << "入栈成功!"<<endl;
else cout << "入栈失败!";
}
}
//依次弹出栈顶元素
void StackOut(SqStack& S) {
int value;
cout << "依次弹出的栈顶元素为:\n";
while (Pop(S,value))
{
cout << value << "\t";
}
} int main()
{
int opearateNum = 0;//操作值
SqStack S;
InitStack(S);//初始化堆栈 while (true)
{
cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl;
cin >> opearateNum;
if (opearateNum == 5)
break;
switch (opearateNum)
{
case 1:
//入栈
StackInput(S);
system("pause");
system("cls");
break;
case 2:
//依次出栈
StackOut(S);
system("pause");
system("cls");
break;
case 3:
//读栈顶元素
if (!isEmpty(S))cout << GetTop(S) << endl;
else cout << "堆栈无元素!" << endl;
system("pause");
system("cls");
break;
case 4:
//弹出栈顶元素
int value;//弹出的值
if (!Pop(S, value)) cout << "堆栈无元素" << endl;
else cout << "弹出的栈顶元素的值为:" << value << endl;
system("pause");
system("cls");
break;
default:
cout << "无效操作,请重新输入!" << endl;
break;
}
}
}

  二、链栈

#include <iostream>
using namespace std;
//链栈的存储结构
typedef struct StackNode {
int elem;//栈中的数据元素
struct StackNode* next;
}*LinkStack;
//链栈的初始化
void InitStack(LinkStack& S) {
S = NULL;//构造一个空栈S
}
//入栈,在栈顶插入元素e
bool Push(LinkStack &S,int e) {
StackNode *p = new StackNode;//生成新结点
p->elem = e;//将新结点p的数据域设置为e
p->next = S;//将新结点插入栈顶
S = p;//修改栈顶指针为p
return true;
}
//出栈,删除S的栈顶元素,用第二个参数返回其值
bool Pop(LinkStack& S, int& e) {
if (S == NULL) return false;//栈空 返回false
e = S->elem;//将栈顶元素值赋给e
StackNode* p = S;//用p临时保存栈顶元素空间,以备释放
S = S->next;//修改栈顶指针
delete p;//释放原来的栈顶内存空间
return true;
}
//取栈顶元素,不修改栈顶指针
int GetTop(LinkStack S) {
if (S != NULL) return S->elem;//如果栈为非空则返回栈顶元素
}
//判断链栈S是否为空栈
bool isEmpty(LinkStack S) {
if (S != NULL) return false;//不为空返回fasle
return true;//为空返回true
}
//批量入栈
void StackInput(LinkStack& S) {
int value;
int PushNum;//入栈数
cout << "请输入入几次栈:";
cin >> PushNum;//用户输入入几次栈
for (int i = 0; i < PushNum; i++) {
cout << "请输入第" << i + 1 << "个值:";
cin >> value;
if (Push(S, value)) cout << "入栈成功!" << endl;
else cout << "入栈失败!";
}
}
//依次弹出栈顶元素
void StackOut(LinkStack& S) {
int value;
cout << "依次弹出的栈顶元素为:\n";
while (Pop(S, value))
{
cout << value << "\t";
}
} int main()
{
int opearateNum = 0;//操作值
LinkStack S;
InitStack(S);//初始化堆栈 while (true)
{
cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl;
cin >> opearateNum;
if (opearateNum == 5)
break;
switch (opearateNum)
{
case 1:
//入栈
StackInput(S);
system("pause");
system("cls");
break;
case 2:
//依次出栈
StackOut(S);
system("pause");
system("cls");
break;
case 3:
//读栈顶元素
if (!isEmpty(S)) cout << GetTop(S) << endl;
else cout << "堆栈为空栈!" << endl;
system("pause");
system("cls");
break;
case 4:
//弹出栈顶元素
int value;//弹出的值
if (!Pop(S, value)) cout << "堆栈为空栈!" << endl;
else cout << "弹出的栈顶元素的值为:" << value << endl;
system("pause");
system("cls");
break;
default:
cout << "无效操作,请重新输入!" << endl;
break;
}
}
}

  

最新文章

  1. Matlab绘图函数一览
  2. FusionCharts中仪表盘相关属性
  3. MQTT V3.1--我的理解
  4. hdu5481 Desiderium
  5. t检验
  6. 安装64位mysql5.626
  7. Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮
  8. C#学习笔记(1) --简叙.net体系结构
  9. shell 脚本中 命令
  10. 反片语(map)
  11. 快速了解Druid——实时大数据分析软件
  12. 给pdf文件添加防伪水印logo(附工程源码下载)
  13. 【Netty】(9)---Netty编解码器
  14. 01-css的引入方式
  15. VMware虚拟机安装Linux系统centos7(一)
  16. iview 刷新滞后于html问题
  17. appcan更新
  18. break,continue以及pass的使用
  19. url传带有汉字的参数乱码解决
  20. 【洛谷 P2147】 [SDOI2008]洞穴勘测(LCT)

热门文章

  1. 面试官:哪些场景会产生OOM?怎么解决?
  2. 部署cobbler服务器
  3. DRF序列化、认证、跨域问题
  4. asp.net core 从 3.1 到 5.0
  5. 5.Strom-事务型拓扑
  6. python-面向过程面向对象和栈的实现
  7. 1500多套微信小程序带后端源码-史上最全的不同行业的源码集合
  8. 刷题[b01lers2020]Life on Mars
  9. awk的一些认识
  10. 剑指offer-递归和循环