LeetCode 232用栈实现队列
300 Words|Read in about 2 Min|本文总阅读量次
leetcode第232题,用栈实现队列。采用栈的算法来完成。
LeetCode 232用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的。 - 你所使用的语言也许不支持栈。你可以使用
list
或者deque
(双端队列)来模拟一个栈,只要是标准的栈操作即可。
示例 1:
1输入:
2["MyQueue", "push", "push", "peek", "pop", "empty"]
3[[], [1], [2], [], [], []]
4输出:
5[null, null, null, 1, 1, false]
6
7解释:
8MyQueue myQueue = new MyQueue();
9myQueue.push(1); // queue is: [1]
10myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
11myQueue.peek(); // return 1
12myQueue.pop(); // return 1, queue is [2]
13myQueue.empty(); // return false
提示:
1 <= x <= 9
- 最多调用
100
次push
、pop
、peek
和empty
- 假设所有操作都是有效的 (例如,一个空的队列不会调用
pop
或者peek
操作)
进阶:
- 你能否实现每个操作均摊时间复杂度为
O(1)
的队列?换句话说,执行n
个操作的总时间复杂度为O(n)
,即使其中一个操作可能花费较长时间。
思路
解题思路是双堆栈
- 有两个栈,其中一个是A栈,另外一个是B栈。A栈用于队列元素的进入,B栈用于队列元素的出去。
- 不断的往A栈压入元素,然后我们需要从输出B栈拿取元素时。如果现B栈为空栈,那么需要把输入A栈的元素一次性压入B栈中。等到输入栈为空且输出栈不为空的时候,逐个去除输出栈元素。
解题
1class MyQueue {
2 private Stack<Integer> in;
3 private Stack<Integer> out;
4
5 public MyQueue() {
6 in = new Stack<Integer>();
7 out = new Stack<Integer>();
8 }
9
10 public void push(int x) {
11 in.push(x);
12 }
13
14 public int pop() {
15 if(out.isEmpty())
16 {
17 in2out();
18 }
19 return out.pop();
20 }
21
22 public int peek() {
23 if(out.isEmpty())
24 {
25 in2out();
26 }
27 return out.peek();
28 }
29
30 public boolean empty() {
31 return in.isEmpty() && out.isEmpty();
32 }
33
34 private void in2out()
35 {
36 while(!in.isEmpty())
37 {
38 out.push(in.pop());
39 }
40 }
41}
42
43/**
44 * Your MyQueue object will be instantiated and called as such:
45 * MyQueue obj = new MyQueue();
46 * obj.push(x);
47 * int param_2 = obj.pop();
48 * int param_3 = obj.peek();
49 * boolean param_4 = obj.empty();
50 */