225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
思路
两个队列,一个队列用于进行各种操作,一个队列用于备份。
当要出栈时,将操作队列中最后一个元素之前的元素都依次出队并放到备份队列中,
借此找到操作队列中的最后一个元素,将最后一个元素保存下来等待返回,
并将备份队列中的队列再依次放回操作队列中,经保存下来的元素返回,操作结束
class MyStack {
Queue q1 = null; //操作队列
Queue q2 = null; //备份队列
public MyStack() {
q1 = new LinkedList();
q2 = new LinkedList();
}
public void push(int x) {
q1.offer(x);
}
public int pop() {
//将最后一个之前的备份
Object result = null;
while(q1.size() > 0){
result = q1.poll();
if(q1.size() > 0){
q2.offer(result);
}
}
//将备份的重新放回操作队列
Object mid = null;
while(q2.size() > 0){
mid = q2.poll();
q1.offer(mid);
}
return (int) result;
}
public int top() {
//将最后一个之前的备份
Object result = null;
while(q1.size() > 0){
result = q1.poll();
q2.offer(result);
}
//将备份的重新放回操作队列
Object mid = null;
while(q2.size() > 0){
mid = q2.poll();
q1.offer(mid);
}
return (int) result;
}
public boolean empty() {
return !(q1.size() > 0);
}
}
/**
* 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();
*/