双栈实现队列操作

利用两个栈来实现一个队列,这里用的是自己写的栈、还有队列这两个数据结构。当然还可以利用继承的方式来实现队列,这里目前只有不用继承的方式。

原理: 
思路一: 
将stack1作为存储空间,将stack2作为临时缓冲区 
入队时:直接压入stack1 
出队时:将stack1中的元素依次压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再压回给stack1

思路二: 
入队时:判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中 
出队时:判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,在将stack2的栈顶元素弹出,否则,直接弹出stack2的栈顶元素

思路三: 
入队时:判断stack1是否为满,没有满就存入stack1 
出队时:判断stack2是否为空,如果stack2是空,将stack1依次压入stack2,并弹出最上面的元素,如果stack2不为空,直接弹出最上面的元素

这里的my_queue没有继承my_stack,my_stack相当于是实现了栈的功能,my_queue有两个栈的对象来帮助实现队列的操作。

 
 
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. template<class T>
  5. class my_stack {
  6. private:
  7. T *l;
  8. int top;//用来指向栈顶元素
  9. public:
  10. my_stack():top(-1)
  11. {
  12. l = new T[100];
  13. }
  14. ~my_stack()
  15. {
  16. delete l;
  17. }
  18. void pop();
  19. void push(T a);
  20. T top1();
  21. bool isempty();
  22. int size();
  23. };
  24. template<class T>
  25. void my_stack<T>::pop()
  26. {
  27. if (top < 0)
  28. {
  29. cout << "stack is empty,pop is forbidden!" << endl;
  30. //exit(0);
  31. }
  32. else
  33. {
  34. top = top - 1;
  35. }
  36. }
  37. template<class T>
  38. void my_stack<T>::push(T a)
  39. {
  40. if (top == 100-1)
  41. {
  42. cout << "stack is full!" << endl;
  43. //exit(0);
  44. }
  45. else
  46. {
  47. top = top + 1;
  48. l[top] = a;
  49. }
  50. }
  51. template<class T>
  52. T my_stack<T>::top1()
  53. {
  54. if (top != -1)
  55. return l[top] ;
  56. //cout << "stack is empty!" << endl;
  57. //exit(0);
  58. }
  59. template<class T>
  60. bool my_stack<T>::isempty()
  61. {
  62. if (top == -1)
  63. return true;
  64. else
  65. return false;
  66. }
  67. template<class T>
  68. int my_stack<T>::size()
  69. {
  70. return top + 1;
  71. }
  72. /*双栈实现队列思路:
  73. 入队时:判断s1是否为满,没有满就存入s1
  74. 出队时:判断s2是否为空,如果s2是空,将s1转入s2,弹出,如果s2不为空,直接弹出*/
  75. template<class T>
  76. class my_queue
  77. {
  78. private:
  79. my_stack<T> s1, s2;
  80. public:
  81. my_queue()
  82. {
  83. }
  84. ~my_queue()
  85. {
  86. }
  87. void enqueue(T a);
  88. void dequeue();
  89. bool isempty();
  90. int size();
  91. };
  92. template<class T>
  93. int my_queue<T>::size()
  94. {
  95. return s1.size() + s2.size();
  96. }
  97. template<class T>
  98. bool my_queue<T>::isempty()
  99. {
  100. return s1.isempty() && s2.isempty();
  101. }
  102. template <class T>
  103. void my_queue<T>::enqueue(T a)
  104. {
  105. if (s1.top1() == 100 - 1)
  106. cout << "full stack1" << endl;
  107. else
  108. s1.push(a);
  109. }
  110. template <class T>
  111. void my_queue<T>::dequeue()
  112. {
  113. if (s2.isempty())
  114. {
  115. int size = s1.size();//s1的size在操作的时候会改变,所以需要另外赋值出来
  116. for (int i = 0; i < size; i++) {
  117. s2.push(s1.top1());
  118. s1.pop();
  119. }
  120. s2.pop();
  121. }
  122. else
  123. {
  124. s2.pop();
  125. }
  126. }
  127. int main()
  128. {
  129. my_queue<int> q1;
  130. q1.enqueue(1);
  131. q1.enqueue(2);
  132. q1.dequeue();
  133. system("pause");
  134. return 0;
  135. }

猜你喜欢

转载自blog.csdn.net/Zhou_xinke/article/details/81012432