请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
用队列实现栈的关键,在于怎样去实现pop和top中仿照栈的后进先出操作。
其实只需要一个队列就可以解决该问题。例如入队顺序是123,按照栈的弹出操作需要取3,而取3的唯一方法是先取出1和2。我们可以先分别将1和2取出放在队列末尾,此时不论是pop弹出栈顶还是top查询栈顶都可以取到3。
所以我们可以先定义一个函数,用于将队列中除最后一个的所有元素全部移进队尾,这样原队尾元素就成为队头。若要弹出则直接用出队列操作即可;若要查询则可在取到队头后,再将该队头元素插入队尾。
实现代码如下:
class MyStack {
Queue <Integer> q;
public MyStack() {
q = new LinkedList<Integer>();
}
public void push(int x) {
q.offer(x);
}
public int pop() {
Queue2Stack(q);
int temp = q.poll();
return temp;
}
public int top() {
Queue2Stack(q);
int temp = q.poll();
q.offer(temp);
return temp;
}
public boolean empty() {
return q.isEmpty();
}
public void Queue2Stack(Queue<Integer> q) {
for(int i=1;i<q.size();i++) {
int temp = q.poll();
q.offer(temp);
}
}
}
/**
* 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();
*/