经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
C++实现栈的操作(push和pop)
来源:jb51  时间:2022/7/25 17:16:06  对本文有异议

栈的操作(push和pop)

栈的组织形式

如上图所示:栈也是有多个数据节点组成的,每个节点包含有数据域和指向下一个节点的指针域。并且每次的push、pop和判空都是操作的栈顶指针top。

栈中每个数据节点的定义

  1. class data_node{
  2. public:
  3. data_node() :data(0), next(NULL){}//default constructer function
  4. data_node(int value) :data(value), next(NULL){}//include arg constructer function
  5. int data;
  6. data_node *next;//pointer that point to next node
  7. };

栈的类的定义

  1. class my_stack{
  2. public:
  3. my_stack() :top(NULL){}
  4. void push(data_node new_data);
  5. void pop(data_node *pop_node);
  6. bool empty();
  7. data_node *top;
  8. };

栈的push操作

  1. void my_stack::push(data_node new_data)
  2. {
  3. data_node *pnode = NULL;
  4. pnode = new data_node(new_data.data);
  5. pnode->next = top;
  6. top = pnode;
  7. }
  8. void my_stack::pop(data_node *pop_node)
  9. {
  10. if (empty())
  11. {
  12. printf("this stack is empty\n");
  13. return;
  14. }
  15. pop_node->data = top->data;
  16. data_node *pnode = top;
  17. top = top->next;
  18. delete pnode;
  19. }
  20. bool my_stack::empty()
  21. {
  22. return (top == NULL);
  23. }

完整的代码如下:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #pragma warning(disable:4996)
  4. #include <string>
  5. using namespace std;
  6. class data_node{
  7. public:
  8. data_node() :data(0), next(NULL){}//default constructer function
  9. data_node(int value) :data(value), next(NULL){}//include arg constructer function
  10. int data;
  11. data_node *next;//pointer that point to next node
  12. };
  13. class my_stack{
  14. public:
  15. my_stack() :top(NULL){}
  16. void push(data_node new_data);
  17. void pop(data_node *pop_node);
  18. bool empty();
  19. data_node *top;
  20. };
  21. void my_stack::push(data_node new_data)
  22. {
  23. data_node *pnode = NULL;
  24. pnode = new data_node(new_data.data);
  25. pnode->next = top;
  26. top = pnode;
  27. }
  28. void my_stack::pop(data_node *pop_node)
  29. {
  30. if (empty())
  31. {
  32. printf("this stack is empty\n");
  33. return;
  34. }
  35. pop_node->data = top->data;
  36. data_node *pnode = top;
  37. top = top->next;
  38. delete pnode;
  39. }
  40. bool my_stack::empty()
  41. {
  42. return (top == NULL);
  43. }
  44. int main()
  45. {
  46. data_node pop_node(0);
  47. my_stack stack;
  48. stack.push(3);
  49. stack.push(2);
  50. stack.push(6);//3,2,6
  51. stack.pop(&pop_node);
  52. //printf("is empty? %d\n", stack.empty());
  53. printf("%2d ", pop_node.data);
  54. stack.pop(&pop_node);
  55. //printf("is empty? %d\n", stack.empty());
  56. printf("%2d ", pop_node.data);
  57. stack.pop(&pop_node);
  58. printf("%2d\n ", pop_node.data);
  59. printf("is empty? %d\n", stack.empty());
  60. return 0;
  61. }

栈应用之进制转换

MyStack.h

  1. #ifndef MYSTACK_H
  2. #define MYSTACK_H
  3. #include <iostream>
  4. using namespace std;
  5. template <typename T>
  6. class MyStack
  7. {
  8. public:
  9. ? ? MyStack(int size); ? ? ? ? ?//分配内存初始化空间,设定栈容量,栈顶
  10. ? ? ~MyStack(); ? ? ? ? ? ? ? ? ? ?//回收栈空间内存
  11. ? ? bool stackEmpty(); ? ? ? ? ?//判定栈是否为空,为空返回true,非空返回false
  12. ? ? bool stackFull(); ? ? ? ? ? //判定栈是否为满,为满返回true,不满返回false
  13. ? ? void clearStack(); ? ? ? ? ?//清空栈
  14. ? ? int stackLength(); ? ? ? ? ?//已有元素的个数
  15. ? ? bool push(T elem); ? ? ? ? ?//元素入栈,栈顶上升
  16. ? ? bool pop(T &elem); ? ? ? ? ?//元素出栈,栈顶下降
  17. ? ? void stackTraverse(bool isFromButtom); ? ? ?//遍历栈中所有元素
  18. private:
  19. ? ? T *m_pBuffer; ? ? ? ? ? ? ? //栈空间指针
  20. ? ? int m_iSize; ? ? ? ? ? ? ? ?//栈容量
  21. ? ? int m_iTop; ? ? ? ? ? ? ? ? //栈顶,栈中元素个数
  22. };
  23. template <typename T>
  24. MyStack<T>::MyStack(int size)
  25. {
  26. ? ? m_iSize = size;
  27. ? ? m_pBuffer = new T[size];
  28. ? ? m_iTop = 0;
  29. }
  30. template <typename T>
  31. MyStack<T>::~MyStack()
  32. {
  33. ? ? delete[]m_pBuffer;
  34. ? ? m_pBuffer = NULL;
  35. }
  36. template <typename T>
  37. bool MyStack<T>::stackEmpty()
  38. {
  39. ? ? if (0 == m_iTop)
  40. ? ? {
  41. ? ? ? ? return true;
  42. ? ? }
  43. ? ? else
  44. ? ? {
  45. ? ? ? ? return false;
  46. ? ? }
  47. }
  48. template <typename T>
  49. bool MyStack<T>::stackFull()
  50. {
  51. ? ? if (m_iTop == m_iSize)
  52. ? ? {
  53. ? ? ? ? return true;
  54. ? ? }
  55. ? ? else
  56. ? ? {
  57. ? ? ? ? return false;
  58. ? ? }
  59. }
  60. template <typename T>
  61. void MyStack<T>::clearStack()
  62. {
  63. ? ? m_iTop = 0;
  64. }
  65. template <typename T>
  66. int MyStack<T>::stackLength()
  67. {
  68. ? ? return m_iTop;
  69. }
  70. template <typename T>
  71. bool MyStack<T>::push(T elem)
  72. {
  73. ? ? if(!stackFull())
  74. ? ? {
  75. ? ? ? ? m_pBuffer[m_iTop] = elem;
  76. ? ? ? ? m_iTop++;
  77. ? ? ? ? return true;
  78. ? ? }
  79. ? ? else
  80. ? ? {
  81. ? ? ? ? return false;
  82. ? ? }
  83. }
  84. template <typename T>
  85. bool MyStack<T>::pop(T &elem)
  86. {
  87. ? ? if (!stackEmpty())
  88. ? ? { ??
  89. ? ? ? ? m_iTop--;
  90. ? ? ? ? elem = m_pBuffer[m_iTop];
  91. ? ? ? ? return true;
  92. ? ? }
  93. ? ? else
  94. ? ? {
  95. ? ? ? ? return false;
  96. ? ? }
  97. }
  98. template <typename T>
  99. void MyStack<T>::stackTraverse(bool isFromButtom)
  100. {
  101. ? ? if (isFromButtom)
  102. ? ? {
  103. ? ? ? ? for (int i = 0; i < m_iTop; i++)
  104. ? ? ? ? {
  105. ? ? ? ? ? ? cout << m_pBuffer[i];
  106. ? ? ? ? }
  107. ? ? }
  108. ? ? else?
  109. ? ? ? ? for (int i = m_iTop -1; i >= 0; i--)
  110. ? ? ? ? {
  111. ? ? ? ? ? ? cout << m_pBuffer[i];
  112. ? ? ? ? }
  113. ? ? cout << endl;
  114. }
  115. #endif MYSTACK_H

main.cpp

  1. #include "MyStack.h"
  2. #define BINARY ? ? ?2
  3. #define OCTONSRY ? ?8
  4. #define HEXADECTMAL 16
  5. int main()
  6. {
  7. ? ? char num[] = "0123456789ABCDEF";
  8. ? ? MyStack<char> *pStack = new MyStack<char>(50);
  9. ? ? int N = 0;
  10. ? ? cin >> N;
  11. ? ? int mod = 0;
  12. ? ? while (N != 0)
  13. ? ? {
  14. ? ? ? ? mod = N % HEXADECTMAL;
  15. ? ? ? ? pStack->push(num[mod]);
  16. ? ? ? ? N = N / HEXADECTMAL;
  17. ? ? }
  18. ? ? pStack->stackTraverse(false);
  19. ? ? delete pStack;
  20. ? ? pStack = NULL;
  21. ? ? system("pause");
  22. ? ? return 0;
  23. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号