【数据结构】栈面试题--两个栈实现一个队列

前端之家收集整理的这篇文章主要介绍了【数据结构】栈面试题--两个栈实现一个队列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先我们必须清楚,栈先进后出,队列先进先出。这道他们各自的特点之后,我们用两个栈来实现一个队列。

下边给出图片


下边给出代码

  1. template<typename T>
  2. class Queue
  3. {
  4. public:
  5. void Push(const T& x)
  6. {
  7. if (!_s2.empty())
  8. {
  9. while (!_s2.empty())
  10. {
  11. _s1.push(_s2.top());
  12. _s2.pop();
  13. }
  14. }
  15. _s1.push(x);
  16. }
  17. void Pop()
  18. {
  19. if (_s1.empty() && _s2.empty())//s1,s2均为空
  20. {
  21. return;
  22. }
  23. if (!_s2.empty())//s2不为空
  24. {
  25. _s2.pop();
  26. }
  27. if (!_s1.empty() && _s2.empty())//s1不为空
  28. {
  29. //while(!_s1.empty())
  30. while (_s1.size() != 1)
  31. {
  32. _s2.push(_s1.top());//可以少push一次
  33. _s1.pop();
  34. }
  35. _s1.pop();
  36. }
  37. }
  38. void Display()
  39. {
  40. while (!_s2.empty())
  41. {
  42. cout << _s2.top() << " ";
  43. _s2.pop();
  44. }
  45. while (!_s1.empty())
  46. {
  47. _s2.push(_s1.top());
  48. _s1.pop();
  49. }
  50. while (!_s2.empty())
  51. {
  52. cout << _s2.top() << " ";
  53. _s2.pop();
  54. }
  55. }
  56. int Size()
  57. {
  58. return _s1.size() + _s2.size();
  59. }
  60. public:
  61. stack<T> _s1;
  62. stack<T> _s2;
  63. };
  64. void test()
  65. {
  66. Queue<int> q;
  67. cout << q.Size() << endl;
  68. q.Push(2);
  69. q.Push(3);
  70. q.Push(1);
  71. q.Pop();
  72. q.Push(4);
  73. q.Push(5);
  74. q.Pop();
  75. cout << q.Size() << endl;
  76. q.Display();
  77. }
  78. int main()
  79. {
  80. test();
  81. system("pause");
  82. return 0;
  83. }


以上代码实现方法图片右下角的解决方案所述(即就是:push时,如果栈2不为空,将栈2的元素push进栈1,

然后,直接将新的元素push进栈1;如果栈2为空,直接push进栈1 pop时,当栈2不为空,直接从栈2pop;当栈

2为空,将栈1的元素push进栈2(可以少push一次),弹出栈顶元素)

下边再给出另外一种实现办法(即就是一次pop之后,栈2的元素都push进栈1,具体思路图片中并没有提出):

看下边的代码(仅仅给出pop和push函数,其他的函数都同上)

  1. void Push(const T& x)
  2. {
  3. _s1.push(x);
  4. }
  5. void Pop()
  6. {
  7. if (_s1.empty() && _s2.empty())//s1,s2均为空
  8. {
  9. return;
  10. }
  11. if (!_s2.empty())//s2不为空
  12. {
  13. _s2.pop();
  14. }
  15. else if (!_s1.empty() && _s2.empty())//s1不为空
  16. {
  17. //while(!_s1.empty())
  18. while (_s1.size() != 1)
  19. {
  20. _s2.push(_s1.top());//可以少push一次
  21. _s1.pop();
  22. }
  23. _s1.pop();
  24. }
  25. while (!_s2.empty())
  26. {
  27. _s1.push(_s2.top());
  28. _s2.pop();
  29. }
  30. }


上边代码就实现了每次pop完之后,都将栈2中的剩余元素push进栈1,这种方法可能较第一种方法麻烦一点,但是都

可以实现。

如果以上叙述有问题,可以提出~~~

猜你在找的数据结构相关文章