当前位置:   article > 正文

C++实现栈的初始化、进栈、出栈、清空、销毁、进制转换等操作_c++清空栈

c++清空栈

目录

 栈的定义和特点

 预定义

初始化 

判断栈是否为空 

求顺序栈的长度 

 清空顺序栈

 销毁顺序栈

 入栈

出栈 

 取栈顶元素

 输出栈中的元素

 进制转换和输出

 完整代码

运行结果:


栈的定义和特点

定义:(Stack)是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表。

又称后进先出(Last In First Out)的线性表,简称LIFO结构。

逻辑结构:与线性表相同,仍为一对一关系。

存储结构:用顺序栈和链栈存储均可,但以顺序栈更常见。

运算规则:只能在栈顶运算,且访问节点时仍依照后进先出的原则。

 预定义

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #define MaxSize 100
  5. #define Ok 1
  6. #define Error 0
  7. #define OverFlow -2
  8. using namespace std;
  9. typedef int Status;
  10. typedef int SElemType;
  11. typedef struct{
  12. SElemType *top; //栈顶指针
  13. SElemType *base; //栈底指针
  14. int stacksize; //栈可用最大容量
  15. }SqStack;
  16. SqStack S,T;

初始化 

  1. //初始化
  2. Status InitStack(SqStack &S){
  3. S.base = (SElemType*)malloc(sizeof(SElemType) * MaxSize);
  4. if(!S.base)
  5. exit(OverFlow); //存储分配失败
  6. S.top = S.base; //栈顶指针等于栈底指针
  7. S.stacksize = MaxSize;
  8. return Ok;
  9. }

判断栈是否为空 

  1. //判断栈是否为空
  2. Status StackEmpty(SqStack S){
  3. if(S.top == S.base)
  4. return Ok;
  5. else
  6. return Error;
  7. }

顺序栈的长度 

  1. //求顺序栈的长度
  2. int StackLength(SqStack S){
  3. return S.top - S.base;
  4. }

 清空顺序栈

  1. //清空顺序栈
  2. Status ClearStack(SqStack &S){
  3. if(S.base)
  4. S.top = S.base;
  5. return Ok;
  6. }

 销毁顺序栈

  1. //销毁顺序栈
  2. Status DestroyStack(SqStack &S){
  3. if(S.base){
  4. delete S.base; //释放内存
  5. S.stacksize = 0; //清空栈容量
  6. S.base = S.top = NULL; //指针指向空
  7. }
  8. return Ok;
  9. }

 入栈

  1. //顺序栈的入栈
  2. Status Push(SqStack &S,SElemType e)
  3. {
  4. if(S.top - S.base >= S.stacksize) //栈满,扩容
  5. {
  6. S.base = (SElemType *)realloc(S.base,(S.stacksize * 2)*sizeof(SElemType));
  7. if(!S.base)
  8. exit(OverFlow);
  9. S.top = S.base + S.stacksize;
  10. S.stacksize *= 2;
  11. }
  12. *S.top++ = e;
  13. return Ok;
  14. }

出栈 

  1. //顺序栈的出栈
  2. Status Pop(SqStack &S,SElemType &e){
  3. if(S.top == S.base)
  4. return Error;
  5. e = *--S.top;
  6. return Ok;
  7. }

 取栈顶元素

  1. //取栈顶元素
  2. Status GetTop(SqStack S,SElemType &e)
  3. {
  4. if(S.top==S.base) //栈为空
  5. return Error;
  6. e = *(S.top-1);
  7. return Ok;
  8. }

 输出栈中的元素

  1. //输出顺序栈中的元素
  2. Status Print(SqStack S){
  3. SElemType *p = S.top;
  4. while(p != S.base)
  5. cout<< *--p << " ";
  6. cout<<endl;
  7. return Ok;
  8. }

 进制转换和输出

  1. //进制转换
  2. Status Num(SqStack &S,int e,int num){
  3. while(e){
  4. Push(S,e % num);
  5. e /= num;
  6. }
  7. }
  8. //输出转换后的元素
  9. Status NumStack(SqStack &S){
  10. SElemType *p = S.top;
  11. while(!StackEmpty(T)){
  12. int ans;
  13. Pop(T,ans);
  14. if(ans < 10)
  15. cout<< ans;
  16. else{
  17. char c;
  18. c = ans - 10 + 'A';
  19. cout<< c;
  20. }
  21. }
  22. cout<<endl;
  23. }

 完整代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #define MaxSize 100
  5. #define Ok 1
  6. #define Error 0
  7. #define OverFlow -2
  8. using namespace std;
  9. typedef int Status;
  10. typedef int SElemType;
  11. typedef struct{
  12. SElemType *top; //栈顶指针
  13. SElemType *base; //栈底指针
  14. int stacksize; //栈可用最大容量
  15. }SqStack;
  16. SqStack S,T;
  17. //初始化
  18. Status InitStack(SqStack &S){
  19. S.base = (SElemType*)malloc(sizeof(SElemType) * MaxSize);
  20. if(!S.base)
  21. exit(OverFlow); //存储分配失败
  22. S.top = S.base; //栈顶指针等于栈底指针
  23. S.stacksize = MaxSize;
  24. return Ok;
  25. }
  26. //判断栈是否为空
  27. Status StackEmpty(SqStack S){
  28. if(S.top == S.base)
  29. return Ok;
  30. else
  31. return Error;
  32. }
  33. //求顺序栈的长度
  34. int StackLength(SqStack S){
  35. return S.top - S.base;
  36. }
  37. //清空顺序栈
  38. Status ClearStack(SqStack &S){
  39. if(S.base)
  40. S.top = S.base;
  41. return Ok;
  42. }
  43. //销毁顺序栈
  44. Status DestroyStack(SqStack &S){
  45. if(S.base){
  46. delete S.base; //释放内存
  47. S.stacksize = 0; //清空栈容量
  48. S.base = S.top = NULL; //指针指向空
  49. }
  50. return Ok;
  51. }
  52. //顺序栈的入栈
  53. Status Push(SqStack &S,SElemType e)
  54. {
  55. if(S.top - S.base >= S.stacksize) //栈满,扩容
  56. {
  57. S.base = (SElemType *)realloc(S.base,(S.stacksize * 2)*sizeof(SElemType));
  58. if(!S.base)
  59. exit(OverFlow);
  60. S.top = S.base + S.stacksize;
  61. S.stacksize *= 2;
  62. }
  63. *S.top++ = e;
  64. return Ok;
  65. }
  66. //顺序栈的出栈
  67. Status Pop(SqStack &S,SElemType &e){
  68. if(S.top == S.base)
  69. return Error;
  70. e = *--S.top;
  71. return Ok;
  72. }
  73. //取栈顶元素
  74. Status GetTop(SqStack S,SElemType &e)
  75. {
  76. if(S.top==S.base) //栈为空
  77. return Error;
  78. e = *(S.top-1);
  79. return Ok;
  80. }
  81. //输出顺序栈中的元素
  82. Status Print(SqStack S){
  83. SElemType *p = S.top;
  84. while(p != S.base)
  85. cout<< *--p << " ";
  86. cout<<endl;
  87. return Ok;
  88. }
  89. //进制转换
  90. Status Num(SqStack &S,int e,int num){
  91. while(e){
  92. Push(S,e % num);
  93. e /= num;
  94. }
  95. }
  96. //输出转换后的数
  97. Status NumStack(SqStack &S){
  98. SElemType *p = S.top;
  99. while(!StackEmpty(T)){
  100. int ans;
  101. Pop(T,ans);
  102. if(ans < 10)
  103. cout<< ans;
  104. else{
  105. char c;
  106. c = ans - 10 + 'A';
  107. cout<< c;
  108. }
  109. }
  110. cout<<endl;
  111. }
  112. int main()
  113. {
  114. int order,init = 0,des = 0,len,e;
  115. cout<< "*--------------栈----------------*"<<endl;
  116. cout<< "*---------1.初始化栈-------------*"<<endl;
  117. cout<< "*---------2.销毁栈---------------*"<<endl;
  118. cout<< "*---------3.清空栈---------------*"<<endl;
  119. cout<< "*---------4.栈判空---------------*"<<endl;
  120. cout<< "*---------5.求栈长度-------------*"<<endl;
  121. cout<< "*---------6.获取栈顶元素---------*"<<endl;
  122. cout<< "*---------7.插入一个元素---------*"<<endl;
  123. cout<< "*---------8.删除一个元素---------*"<<endl;
  124. cout<< "*---------9.输出所有元素---------*"<<endl;
  125. cout<< "*---------10.进制转换------------*"<<endl;
  126. do{
  127. cout<< "请输入指令:";
  128. cin>> order;
  129. if(order == 0 || order > 10)
  130. cout<< "没有该指令" <<endl;
  131. else if(!init && order > 1 && order != 10)
  132. cout<< "请先初始化栈" <<endl;
  133. else if(des && order > 1 && order != 10)
  134. cout<< "栈已销毁,请先初始化" <<endl;
  135. else
  136. switch(order)
  137. {
  138. case 1:
  139. InitStack(S);
  140. init=1;
  141. des=0;
  142. cout<< "初始化完成!" <<endl;
  143. break;
  144. case 2:
  145. DestroyStack(S);
  146. des = 1;
  147. cout<< "栈已销毁" <<endl;
  148. break;
  149. case 3:
  150. ClearStack(S);
  151. cout<< "栈已清空" <<endl;
  152. break;
  153. case 4:
  154. if(!StackEmpty(S))
  155. cout<< "栈非空" <<endl;
  156. else
  157. cout<< "栈为空" <<endl;
  158. break;
  159. case 5:
  160. len=StackLength(S);
  161. cout<< "栈长度为:" << len <<endl;
  162. break;
  163. case 6:
  164. if(GetTop(S,e))
  165. cout<< "栈顶元素为:" << e <<endl;
  166. else
  167. cout<< "空栈,无栈顶元素" <<endl;
  168. break;
  169. case 7:
  170. cout<< "请输入插入元素:";
  171. cin>> e;
  172. Push(S,e);
  173. cout<< "入栈成功" <<endl;
  174. break;
  175. case 8:
  176. if(Pop(S,e))
  177. cout<< "栈顶元素" << e << "出栈成功" <<endl;
  178. else
  179. cout<< "栈为空" <<endl;
  180. break;
  181. case 9:
  182. cout<< "栈为:";
  183. Print(S);
  184. break;
  185. case 10:
  186. int num;
  187. cout<< "输入一个十进制数:";
  188. cin>> e;
  189. cout<< "输入要转换的进制:";
  190. cin>> num;
  191. InitStack(T);
  192. cout<< "10进制数" << e << "转换为" << num <<"进制数后为:";
  193. if(e < 0)
  194. {
  195. cout<< '-';
  196. e = -e;
  197. }
  198. if(!e)
  199. cout<< 0;
  200. Num(T,e,num);
  201. NumStack(T);
  202. break;
  203. default:
  204. cout<< "程序已退出" <<endl;
  205. break;
  206. }
  207. }while(order>=0);
  208. return Ok;
  209. }

运行结果:

若以上代码有任何错误或可以改进的地方欢迎在评论区指出并讨论。
感谢你的阅读与支持!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/405000?site
推荐阅读
相关标签
  

闽ICP备14008679号