一、顺序栈

  

  1. #include <iostream>
  2. using namespace std;
  3. #define MAXSIZE 100 //栈的最大容量
  4. typedef struct {
  5. int* base;//栈底指针
  6. int* top;//栈顶指针
  7. int stacksize;//栈可用的最大容量
  8. }SqStack;
  9.  
  10. void InitStack(SqStack& S) {
  11. //构造空栈
  12. S.base = new int[MAXSIZE];
  13. if (!S.base) exit(OVERFLOW);//存储分配失败
  14. S.top = S.base;//top初始为base表示为空栈
  15. S.stacksize = MAXSIZE;
  16. }
  17.  
  18. //入栈
  19. bool Push(SqStack& S, int e) {
  20. //插入元素e为新的栈顶元素
  21. if (S.top - S.base == S.stacksize) return false;//栈满
  22. *S.top++ = e;//元素e压入栈顶,栈顶指针加1
  23. return true;
  24. }
  25. //出栈
  26. bool Pop(SqStack& S, int& e) {
  27. //删除S的栈顶元素,用e返回其值
  28. if (S.top == S.base) return false;//top=base表示为空栈,返回NULL
  29. e=*(--S.top);//栈顶指针减1,将栈顶元素赋值给e
  30. return true;
  31. }
  32. //取栈顶元素,返回S的栈顶元素,不修改栈顶指针
  33. int GetTop(SqStack S) {
  34. if (S.top != S.base) return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
  35. return NULL;
  36. }
  37. //判断顺序栈S是否为空栈
  38. bool isEmpty(SqStack S) {
  39. if (S.top!=S.base) return false;//不为空返回fasle
  40. return true;//为空返回true
  41. }
  42. //批量入栈
  43. void StackInput(SqStack& S) {
  44. int value;
  45. cout << "请输入入几次栈:";
  46. cin >> S.stacksize;//用户输入入几次栈
  47. for (int i = 0; i < S.stacksize; i++) {
  48. cout << "请输入第" << i + 1 << "个值:";
  49. cin >> value;
  50. if (Push(S, value)) cout << "入栈成功!"<<endl;
  51. else cout << "入栈失败!";
  52. }
  53. }
  54. //依次弹出栈顶元素
  55. void StackOut(SqStack& S) {
  56. int value;
  57. cout << "依次弹出的栈顶元素为:\n";
  58. while (Pop(S,value))
  59. {
  60. cout << value << "\t";
  61. }
  62. }
  63.  
  64. int main()
  65. {
  66. int opearateNum = 0;//操作值
  67. SqStack S;
  68. InitStack(S);//初始化堆栈
  69.  
  70. while (true)
  71. {
  72. cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl;
  73. cin >> opearateNum;
  74. if (opearateNum == 5)
  75. break;
  76. switch (opearateNum)
  77. {
  78. case 1:
  79. //入栈
  80. StackInput(S);
  81. system("pause");
  82. system("cls");
  83. break;
  84. case 2:
  85. //依次出栈
  86. StackOut(S);
  87. system("pause");
  88. system("cls");
  89. break;
  90. case 3:
  91. //读栈顶元素
  92. if (!isEmpty(S))cout << GetTop(S) << endl;
  93. else cout << "堆栈无元素!" << endl;
  94. system("pause");
  95. system("cls");
  96. break;
  97. case 4:
  98. //弹出栈顶元素
  99. int value;//弹出的值
  100. if (!Pop(S, value)) cout << "堆栈无元素" << endl;
  101. else cout << "弹出的栈顶元素的值为:" << value << endl;
  102. system("pause");
  103. system("cls");
  104. break;
  105. default:
  106. cout << "无效操作,请重新输入!" << endl;
  107. break;
  108. }
  109. }
  110. }

  二、链栈

  1. #include <iostream>
  2. using namespace std;
  3. //链栈的存储结构
  4. typedef struct StackNode {
  5. int elem;//栈中的数据元素
  6. struct StackNode* next;
  7. }*LinkStack;
  8. //链栈的初始化
  9. void InitStack(LinkStack& S) {
  10. S = NULL;//构造一个空栈S
  11. }
  12. //入栈,在栈顶插入元素e
  13. bool Push(LinkStack &S,int e) {
  14. StackNode *p = new StackNode;//生成新结点
  15. p->elem = e;//将新结点p的数据域设置为e
  16. p->next = S;//将新结点插入栈顶
  17. S = p;//修改栈顶指针为p
  18. return true;
  19. }
  20. //出栈,删除S的栈顶元素,用第二个参数返回其值
  21. bool Pop(LinkStack& S, int& e) {
  22. if (S == NULL) return false;//栈空 返回false
  23. e = S->elem;//将栈顶元素值赋给e
  24. StackNode* p = S;//用p临时保存栈顶元素空间,以备释放
  25. S = S->next;//修改栈顶指针
  26. delete p;//释放原来的栈顶内存空间
  27. return true;
  28. }
  29. //取栈顶元素,不修改栈顶指针
  30. int GetTop(LinkStack S) {
  31. if (S != NULL) return S->elem;//如果栈为非空则返回栈顶元素
  32. }
  33. //判断链栈S是否为空栈
  34. bool isEmpty(LinkStack S) {
  35. if (S != NULL) return false;//不为空返回fasle
  36. return true;//为空返回true
  37. }
  38. //批量入栈
  39. void StackInput(LinkStack& S) {
  40. int value;
  41. int PushNum;//入栈数
  42. cout << "请输入入几次栈:";
  43. cin >> PushNum;//用户输入入几次栈
  44. for (int i = 0; i < PushNum; i++) {
  45. cout << "请输入第" << i + 1 << "个值:";
  46. cin >> value;
  47. if (Push(S, value)) cout << "入栈成功!" << endl;
  48. else cout << "入栈失败!";
  49. }
  50. }
  51. //依次弹出栈顶元素
  52. void StackOut(LinkStack& S) {
  53. int value;
  54. cout << "依次弹出的栈顶元素为:\n";
  55. while (Pop(S, value))
  56. {
  57. cout << value << "\t";
  58. }
  59. }
  60.  
  61. int main()
  62. {
  63. int opearateNum = 0;//操作值
  64. LinkStack S;
  65. InitStack(S);//初始化堆栈
  66.  
  67. while (true)
  68. {
  69. cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl;
  70. cin >> opearateNum;
  71. if (opearateNum == 5)
  72. break;
  73. switch (opearateNum)
  74. {
  75. case 1:
  76. //入栈
  77. StackInput(S);
  78. system("pause");
  79. system("cls");
  80. break;
  81. case 2:
  82. //依次出栈
  83. StackOut(S);
  84. system("pause");
  85. system("cls");
  86. break;
  87. case 3:
  88. //读栈顶元素
  89. if (!isEmpty(S)) cout << GetTop(S) << endl;
  90. else cout << "堆栈为空栈!" << endl;
  91. system("pause");
  92. system("cls");
  93. break;
  94. case 4:
  95. //弹出栈顶元素
  96. int value;//弹出的值
  97. if (!Pop(S, value)) cout << "堆栈为空栈!" << endl;
  98. else cout << "弹出的栈顶元素的值为:" << value << endl;
  99. system("pause");
  100. system("cls");
  101. break;
  102. default:
  103. cout << "无效操作,请重新输入!" << endl;
  104. break;
  105. }
  106. }
  107. }

  

C++学习---栈的构建及操作的更多相关文章

  1. C++学习---队列的构建及操作

    一.循环队列 #include <iostream> using namespace std; #define MAXQSIZE 100 typedef struct { int* bas ...

  2. 深度学习之TensorFlow构建神经网络层

    深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...

  3. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  4. 【php学习之路】字符串操作

           无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...

  5. RX学习笔记:JavaScript数组操作

    RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...

  6. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  7. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  8. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

  9. jenkins构建后操作添加“Publish to Subversion repository”与Eclipse更新提交SVN文件冲突

    jenkins配置环境信息: 1.安装“SVN Publisher plugin”插件: 2.在系统管理-系统设置中“Global SVN Publisher Settings” 填写信息:

随机推荐

  1. JVM运行时数据区划分

    Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳 ...

  2. C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

    1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫 ...

  3. (专题一)06 MATLAB的算术运算

    基本算术运算 乘法运算:A的行数等于B的列数(A,B两矩阵维数和大小相容) 除法运算 逻辑运算 真为1,假为0 优先级,算术运算的优先级最高,逻辑运算的优先级最低,但逻辑非运算是单目运算,他的优先级比 ...

  4. hw小技巧(转载)

    小弟也第一次参加hw,经过5天hw,确实也学到了许多的东西,但就本次分享而言,我分享一些我认为在hw里面值得注意的东西以及一些小技巧 0x01 信息收集 信息收集这个多西当然都是老生常谈了,你收集的东 ...

  5. Combine 框架,从0到1 —— 5.Combine 提供的发布者(Publishers)

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 提供的发布者(Publishers). 内容概览 前言 Just Future D ...

  6. luogu2756 飞行员配对方案问题 (裸匈牙利)

    匈牙利: 4 81 51 62 53 53 74 54 74 8-1 -1 out:4 #include<iostream> #include<cstdio> #include ...

  7. Java程序员面试学习资料汇总

    整理了一些关于Java程序员面试的书籍及免费资料. 一.书籍篇1)<Offer来了:Java面试核心知识点精讲(原理篇)>精讲Java面试必需的JVM原理.Java基础.并发编程.数据结构 ...

  8. spark源码分析, 任务反序列化及执行

    1 ==> 接受消息,org.apache.spark.executor.CoarseGrainedExecutorBackend#receive case LaunchTask(data) = ...

  9. 登陆页跳出iframe

    1 if(top.location.href != location.href){ 2 top.location.href = location.href; 3 }

  10. sed: -e expression #1, char 23: unknown option to `s'

    语言:bash why? / 作为sed的分隔符,和需要操作的内容有冲突 way? 替换 / 分隔符为 # 或者其他分隔符