Implement Queue by Two Stacks
Question
As the title described, you should only use two stacks to implement a queue's actions.
The queue should support push(element)
, pop()
and top()
where pop is pop the first(a.k.a front) element in the queue.
Both pop and top methods should return the value of first element.
Example
push(1)
pop() // return 1
push(2)
push(3)
top() // return 2
pop() // return 2
Analysis
用两个Stack来实现一个Queue,可以考虑到push()时,几乎与Queue中的offer()一样,都是加在末尾,区别是当Stack pop()时,取出的是最近加入(newest)的元素,而Queue用poll()则是将最老(oldest)的元素取出。使用2个Stack,可以将stack2作为push()时的目标,而另一个stack1用来翻转顺序,只有当peek()或者是poll()时,才需要将元素翻转存入stack1,再进行读取。
Solution
public class Queue {
private Stack<Integer> stack1;
private Stack<Integer> stack2;
public Queue() {
stack1 = new Stack<Integer>();
stack2 = new Stack<Integer>();
}
private void switchStack() {
while (!stack2.empty()) {
stack1.push(stack2.pop());
}
}
public void push(int element) {
stack2.push(element);
}
public int pop() {
if (stack1.empty()) {
switchStack();
}
return stack1.pop();
}
public int top() {
if (stack1.empty()) {
switchStack();
}
return stack1.peek();
}
}
Reference
Last updated
Was this helpful?