题目

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsizeis empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。


    示例: ```cpp 输入: [“MyStack”, “push”, “push”, “top”, “pop”, “empty”] [[], [1], [2], [], [], []] 输出: [null, null, null, 2, 2, false]

解释: MyStack myStack = new MyStack(); myStack.push(1); myStack.push(2); myStack.top(); // 返回 2 myStack.pop(); // 返回 2 myStack.empty(); // 返回 False

  1. **提示:**
  2. - `1 <= x <= 9`
  3. - 最多调用 `100` `push``pop``top` `empty`
  4. - 每次调用 `pop` `top` 都保证栈不为空
  5. <br />**进阶:**你能否仅用一个队列来实现栈。
  6. <a name="fnZgj"></a>
  7. # 解题方法
  8. <a name="skrxf"></a>
  9. ## 使用两个队列
  10. 一个队列用作备份,对栈顶元素操作时,先将主队列元素全部填入备份队列,对栈顶元素操作后再将备份队列元素返回主队列。
  11. <a name="dhWB8"></a>
  12. ## 使用一个队列
  13. 对栈顶元素操作时,将队列头部元素取出再填入队列尾部,如此循环即可。<br />**C++代码:**
  14. ```cpp
  15. class MyStack {
  16. private:
  17. queue<int> A;
  18. public:
  19. MyStack() {
  20. }
  21. void push(int x) {
  22. A.push(x);
  23. }
  24. int pop() {
  25. for(int i = 1; i<A.size(); i++) {
  26. A.push(A.front());
  27. A.pop();
  28. }
  29. int result = A.front();
  30. A.pop();
  31. return result;
  32. }
  33. int top() {
  34. int result = this->pop();
  35. A.push(result);
  36. return result;
  37. }
  38. bool empty() {
  39. return A.empty();
  40. }
  41. };
  42. /**
  43. * Your MyStack object will be instantiated and called as such:
  44. * MyStack* obj = new MyStack();
  45. * obj->push(x);
  46. * int param_2 = obj->pop();
  47. * int param_3 = obj->top();
  48. * bool param_4 = obj->empty();
  49. */