class MyQueue {
Stack<Integer>stackin;
Stack<Integer>stackout;
public MyQueue() {
stackin=new Stack<>();
stackout=new Stack<>();
}
public void push(int x) {
stackin.push(x);
}
public int pop() {
dumpstackin();
return stackout.pop();
}
public int peek() {
dumpstackin();
return stackout.peek();
}
public boolean empty() {
return stackin.isEmpty()&&stackout.isEmpty();
}
private void dumpstackin(){
if(!stackout.isEmpty())return;
while(!stackin.isEmpty()){
stackout.push(stackin.pop());
}
}
}
/**
* 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();
*/
用栈实现队列可以设计两个栈来实现队列先进先出的模式。
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()){
queue2.offer(queue1.poll());
}
Queue<Integer> queueTemp;
queueTemp = queue1;
queue1 = queue2;
queue2 = queueTemp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
用两个队列实现栈,关键在于将后入栈的元素先入辅助队列,之后再将原队列元素入到辅助队列最后将队列互换即可。