题目地址(225. 用队列实现栈)

https://leetcode-cn.com/problems/implement-stack-using-queues/

题目描述

  1. 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop empty)。
  2. 实现 MyStack 类:
  3. void push(int x) 将元素 x 压入栈顶。
  4. int pop() 移除并返回栈顶元素。
  5. int top() 返回栈顶元素。
  6. boolean empty() 如果栈是空的,返回 true ;否则,返回 false
  7. 注意:
  8. 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize is empty 这些操作。
  9. 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
  10. 示例:
  11. 输入:
  12. ["MyStack", "push", "push", "top", "pop", "empty"]
  13. [[], [1], [2], [], [], []]
  14. 输出:
  15. [null, null, null, 2, 2, false]
  16. 解释:
  17. MyStack myStack = new MyStack();
  18. myStack.push(1);
  19. myStack.push(2);
  20. myStack.top(); // 返回 2
  21. myStack.pop(); // 返回 2
  22. myStack.empty(); // 返回 False
  23. 提示:
  24. 1 <= x <= 9
  25. 最多调用100 pushpoptop empty
  26. 每次调用 pop top 都保证栈不为空
  27. 进阶:你能否实现每种操作的均摊时间复杂度为 O(1) 的栈?换句话说,执行 n 个操作的总时间复杂度 O(n) ,尽管其中某个操作可能需要比其他操作更长的时间。你可以使用两个以上的队列。

前置知识


公司

  • 暂无

思路

每次先把数字放到q2 然后将q1的数字加到队列q2 然后交换q1和q2的位置
例如q1现在有 12 这两个数字
要添加3
先加到q2
q2 3
然后将q1中的2线弹出
q2 2-> 3
然后是1
q2 1->2->3

关键点


代码

  • 语言支持:Java

Java Code:

  1. class MyStack {
  2. Queue<Integer> queue1;
  3. Queue<Integer> queue2;
  4. public MyStack() {
  5. queue1 = new LinkedList<>();
  6. queue2 = new LinkedList<>();
  7. }
  8. public void push(int x) {
  9. //先将数字加到q2
  10. queue2.offer(x);
  11. //判断q1是否为空 如果不为空 每次将q1顶部弹出放到q2
  12. //q1 1x 12x 123
  13. //q2 1x 1->2x 1->2->3x
  14. while (!queue1.isEmpty()) {
  15. queue2.offer(queue1.poll());
  16. }
  17. //交换两个队列的位置
  18. Queue<Integer> temp = queue1;
  19. queue1 = queue2;
  20. queue2 = temp;
  21. }
  22. public int pop() {
  23. return queue1.poll();
  24. }
  25. public int top() {
  26. return queue1.peek();
  27. }
  28. public boolean empty() {
  29. return queue1.isEmpty();
  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. * boolean param_4 = obj.empty();
  39. */

复杂度分析

令 n 为数组长度。

  • 时间复杂度:225. 用队列实现栈 - 图1#card=math&code=O%28n%29&id=kW6US)
  • 空间复杂度:225. 用队列实现栈 - 图2#card=math&code=O%28n%29&id=dyB2n)