当前位置:   article > 正文

c++实现栈的各种操作_清空栈函数

清空栈函数

以下是c++实现的栈的各种操作:

本例中栈的结构如下图:


  1. #include <iostream>
  2. using namespace std;
  3. // 定义一个节点的结构
  4. typedef struct Node
  5. {
  6. int data; //数据域
  7. struct Node * next;//指针域
  8. }NODE,*PNODE;
  9. // 定义一个栈结构
  10. typedef struct Stack
  11. {
  12. PNODE pTop; //栈顶
  13. PNODE pBottom; //栈底
  14. }STACK,*PSTACK;
  15. void InitStack(PSTACK ); // 初始化栈的函数
  16. bool PushStack(PSTACK ,int); // 进行压栈操作的函数
  17. void TraverseStack(PSTACK ); // 遍历栈函数
  18. bool IsEmpty(PSTACK ); // 判断栈是否为空的函数
  19. int PopStack(PSTACK); // 进行出栈操作的函数
  20. void Clear(PSTACK ); // 清空栈的函数
  21. int main(void)
  22. {
  23. STACK S; // 定义一个栈
  24. int i;
  25. int num;
  26. int data; // 临时保存用户输入的数据
  27. int re_num; // 保存PopStack函数的返回值
  28. InitStack(&S);
  29. cout << "你想输入的数据个数:";
  30. cin >> num;
  31. for (i = 0;i < num;i++)
  32. {
  33. cout << "第" << i+1 << "个数:";
  34. cin >> data;
  35. if (PushStack(&S,data)) // 调用PushStack函数
  36. {
  37. continue;
  38. }
  39. else
  40. {
  41. cout << "进行进栈操作失败!\n";
  42. }
  43. }
  44. TraverseStack(&S); // 调用遍历函数
  45. cout << endl << "你想去掉的数字个数: ";
  46. cin >> data;
  47. cout << endl << "你去掉的数字是:";
  48. for (i = 0; i < data;i++)
  49. {
  50. re_num = PopStack(&S); // 调用PopStack函数,并把返回值赋给re_num;
  51. cout << re_num << " ";
  52. }
  53. cout << endl << "删除后剩下的数字:";
  54. TraverseStack(&S);
  55. cout << endl;
  56. Clear(&S); // 调用清空栈函数
  57. cout << endl << "清空栈后...\n";
  58. TraverseStack(&S);
  59. cout << endl;
  60. return 0;
  61. }
  62. // 进行栈的初始化的函数
  63. void InitStack(PSTACK pS)
  64. {
  65. pS->pTop = new NODE; // 分配内存空间给栈顶
  66. if (NULL == pS->pTop)
  67. {
  68. cout << "动态分配内存失败\n";
  69. }
  70. else
  71. {
  72. pS->pBottom = pS->pTop; // 使栈底也指向栈顶空间
  73. pS->pTop->next = NULL; // 栈顶指针置为NULL;
  74. }
  75. return ;
  76. }
  77. // 进行进栈操作的函数
  78. bool PushStack(PSTACK pS,int data)
  79. {
  80. PNODE pNew = new NODE; // 定义一个新节点,并分配内存空间
  81. if (NULL == pNew)
  82. {
  83. return false;
  84. }
  85. pNew->data = data; // 把要进栈的数据赋给新节点的data成员
  86. pNew->next = pS->pTop; // 使新节点的指针指向栈顶
  87. pS->pTop = pNew; // 把新节点作为新栈顶
  88. return true;
  89. }
  90. // 遍历栈的函数
  91. void TraverseStack(PSTACK pS)
  92. {
  93. PNODE pNew = pS->pTop;
  94. while(pNew!= pS->pBottom) // 只要栈顶不等于栈底,循环
  95. {
  96. cout << pNew->data << " "; // 打印栈顶的成员data
  97. pNew = pNew->next; // 栈顶指针向下移动一次
  98. }
  99. return ;
  100. }
  101. // 判断栈是否为空
  102. bool IsEmpty(PSTACK pS)
  103. {
  104. if(pS->pTop == pS->pBottom)
  105. {
  106. return true;
  107. }
  108. else
  109. {
  110. return false;
  111. }
  112. }
  113. // 进行出栈操作函数
  114. int PopStack(PSTACK pS)
  115. {
  116. PNODE pSwap = NULL;
  117. int return_val;
  118. if (IsEmpty(pS)) //判断栈是否为空
  119. {
  120. cout << "栈为空." << endl;
  121. }
  122. else
  123. {
  124. return_val = pS->pTop->data; // 把栈顶的成员data的值赋给return_val做为函数返回值
  125. pSwap = pS->pTop; // 使pSwap指向栈顶
  126. pS->pTop = pS->pTop->next; // 使栈顶指向栈顶下一个节点
  127. delete pSwap; // 释放以前的栈顶空间
  128. return return_val;
  129. }
  130. }
  131. // 清空栈的函数
  132. void Clear(PSTACK pS)
  133. {
  134. PNODE pNew = NULL;
  135. while (pS->pTop != pS->pBottom) // 栈顶和栈底不等,循环
  136. {
  137. pNew = pS->pTop; // 使一个新节点和栈顶指向同一空间
  138. pS->pTop = pS->pTop->next; // 使栈顶指向栈顶的下一个节点
  139. delete pNew; // 释放掉以前的栈顶空间
  140. }
  141. return ;
  142. }
运行结果:


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

闽ICP备14008679号