两个栈实现: 栈s1中的数据是:直接push,从下到上是1234,跟队列的顺序相反;
栈s2中的数据是:从上到下是1234,直接pop符合队列的顺序。
s2不为空时,直接在s2中pop就行; s2为空时,先把s1中所有元素都倒过来挪到s2,再从s2中pop
class MyQueue {
Stack<Integer> s1, s2; // s1输入栈 s2输出栈
/** Initialize your data structure here. */
public MyQueue() {
s1 = new Stack();
s2 = new Stack();
}
/** Push element x to the back of queue. */
public void offer(int x) {
s1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int poll() {
if (s2.isEmpty()) {
while(!s1.isEmpty()) { //s2是空的,说明只有s1中的 从底向上自增的栈,此时全倒过来挪到s2中。
s2.push(s1.pop());
}
}
return s2.pop(); //s2是倒序的,符合先进先出
}
/** Get the front element. */
public int peek() {
if (s2.isEmpty()) {
while (!s1.isEmpty()) {
s2.push(s1.pop());
}
}
return s2.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return s1.isEmpty() && s2.isEmpty(); //两个都为空时才是空
}
}
/**
* 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();
*/