题目链接

题目描述

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

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

    示例

    示例1:

    输入: [“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 <= x <= 9
  • 最多调用100pushpoptopempty
  • 每次调用 poptop 都保证栈不为空

    思路

    思路1:双栈

    维护两个栈 que1que2 ,其中 que2 是辅助队列,只有 que1 是真正储存数据的。实现如下:

  • void push(int x) ,直接入队 que1

  • int pop() ,将 que1 元素出队,然后一次入队到 que2 中,直到 que1 中只剩下一个元素,该元素就是我们要返回的元素,将该元素出队后, que1 为空,交换 que1que2 即可。
  • int top() 返回 que1 队尾。
  • boolean empty() 如果 que1 是空的,返回 true ;否则,返回 false

    思路2:单栈

    在思路1中, que2 只在弹出中使用过,它是可以被优化的,方法如下:

  • int pop() ,将 que1 的元素出队后接着入队,直到最后一个元素,弹出该元素即可。

其他方法不变。

题解

思路1:双栈

  1. class MyStack {
  2. private:
  3. queue<int> que1;
  4. queue<int> que2;
  5. public:
  6. /** Initialize your data structure here. */
  7. MyStack() {
  8. }
  9. /** Push element x onto stack. */
  10. void push(int x) {
  11. que1.push(x);
  12. }
  13. /** Removes the element on top of the stack and returns that element. */
  14. int pop() {
  15. int size = que1.size() - 1;
  16. while (size--) {
  17. que2.push(que1.front());
  18. que1.pop();
  19. }
  20. int ret = que1.front();
  21. que1.pop();
  22. swap(que1, que2);
  23. return ret;
  24. }
  25. /** Get the top element. */
  26. int top() {
  27. return que1.back();
  28. }
  29. /** Returns whether the stack is empty. */
  30. bool empty() {
  31. return que1.empty();
  32. }
  33. };
  34. /**
  35. * Your MyStack object will be instantiated and called as such:
  36. * MyStack* obj = new MyStack();
  37. * obj->push(x);
  38. * int param_2 = obj->pop();
  39. * int param_3 = obj->top();
  40. * bool param_4 = obj->empty();
  41. */

思路2:单栈

  1. class MyStack {
  2. private:
  3. queue<int> que1;
  4. public:
  5. /** Initialize your data structure here. */
  6. MyStack() {
  7. }
  8. /** Push element x onto stack. */
  9. void push(int x) {
  10. que1.push(x);
  11. }
  12. /** Removes the element on top of the stack and returns that element. */
  13. int pop() {
  14. int size = que1.size() - 1;
  15. while (size--) {
  16. que1.push(que1.front());
  17. que1.pop();
  18. }
  19. int ret = que1.front();
  20. que1.pop();
  21. return ret;
  22. }
  23. /** Get the top element. */
  24. int top() {
  25. return que1.back();
  26. }
  27. /** Returns whether the stack is empty. */
  28. bool empty() {
  29. return que1.empty();
  30. }
  31. };
  32. /**
  33. * Your MyStack object will be instantiated and called as such:
  34. * MyStack* obj = new MyStack();
  35. * obj->push(x);
  36. * int param_2 = obj->pop();
  37. * int param_3 = obj->top();
  38. * bool param_4 = obj->empty();
  39. */

复杂度分析

思路1:双栈

  • 时间复杂度:除了弹出为 0225-用队列实现栈 - 图1外,其余操作都为 0225-用队列实现栈 - 图2
  • 空间复杂度:0225-用队列实现栈 - 图3

    思路2:单栈

  • 时间复杂度:除了弹出为 0225-用队列实现栈 - 图4外,其余操作都为 0225-用队列实现栈 - 图5

  • 空间复杂度:0225-用队列实现栈 - 图6