[LeetCode] 232. Implement Queue using Stacks

[LeetCode] 232. Implement Queue using Stacks

問題描述

Implement the following operations of a queue using stacks.

1
2
3
4
push(x) -- Push element x to the back of queue.
pop() -- Removes the element from in front of queue.
peek() -- Get the front element.
empty() -- Return whether the queue is empty.

Example:

1
2
3
4
5
6
7
MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek(); // returns 1
queue.pop(); // returns 1
queue.empty(); // returns false

Notes:

You must use only standard operations of a stack – which means only push to top, peek/pop from top, size, and is empty operations are valid.
Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).

解題思維

首先我們要先釐清柱列(Queue)與 Stack(堆)的特性,前者為先進先出,後者為後進先出,題目是要我們使用堆來實現柱列的功能,我們需要用兩個堆來完成,
一個存放資料,另一個暫存資料,解題主要思維是利用堆後進先出的特性,將儲存在第一個堆的資料,依序 pop 出來,同時 push 到暫存的堆裡,將要放入
的資料放入第一堆,最後將暫存的堆裡依序吐出到第一堆,剛好最先進去的資料排在第一個。

Enqueue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 實作Enqueue功能
* @param x 資料
* @remark
*/
public void push(int x) {
//依序先將存在第一個Stack吐到第二個裡
while(!stack1.empty()){
stack2.push(stack1.pop());
}

//將我們儲存的元素存到第一個Stack裡
stack1.push(x);

//依序將存在暫存Stack的元素依序吐回第一個Stack
//維持先進去的元素排在最前面
while(!stack2.empty()){
stack1.push(stack2.pop());
}
}

Dequeue

1
2
3
4
5
6
7
8
9
/**
* 實作Dequeue功能
* @return 返回Stack第一個元素
* @remark
*/
public int pop() {
//直接pop第一個Stack第一個元素
return stack1.pop();
}

程式完整解題

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
Runtime: 0 ms, faster than 100.00% of Java online submissions for Implement Queue using Stacks.
Memory Usage: 40.9 MB, less than 6.25% of Java online submissions for Implement Queue using Stacks.
*/
import java.util.Stack;

class MyQueue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
/** Initialize your data structure here. */
public MyQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}

/** Push element x to the back of queue. */
public void push(int x) {
while(!stack1.empty()){
stack2.push(stack1.pop());
}

stack1.push(x);

while(!stack2.empty()){
stack1.push(stack2.pop());
}
}

/** Removes the element from in front of queue and returns that element. */
public int pop() {
return stack1.pop();
}

/** Get the front element. */
public int peek() {
return stack1.peek();
}

/** Returns whether the queue is empty. */
public boolean empty() {
return stack1.empty();
}
}

/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/