题目描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。
思路:因为栈是后进先出的而队列是先进先出的,因此我们可以通过将一个队列的元素进行出队操作直至该队列只剩一个元素,则该元素就可以当做是栈顶元素。
class MyStack {
private Queue<Integer> A = new LinkedList<>();
private Queue<Integer> B = new LinkedList<>();
/** Initialize your data structure here. */
public MyStack() {
}
/** Push element x onto stack. */
public void push(int x) {
//将x插入A中
A.offer(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
//A和B中都没有元素则返回0
if (A.isEmpty()&&B.isEmpty()){
return 0;
}
int tmp;
//将队列A进行出队操作,直至A中只剩下一个元素,该元素便是栈的栈顶元素
while(A.size()>1){
tmp=A.poll();
B.offer(tmp);
}
int ret=A.poll();
//交换A和B的身份保证下一次插入还是插入到A中
swapAB();
return ret;
}
private void swapAB() {
//交换两个队列
Queue<Integer> temp=A;
A=B;
B=temp;
}
/** Get the top element. */
public int top() {
//当连个队列为空时则返回0
if(A.isEmpty()&&B.isEmpty()){
return 0;
}
int tmp;
//将队列A进行出队操作,直至A中只剩下一个元素,该元素便是栈的栈顶元素
while(A.size()>1){
tmp=A.poll();
B.offer(tmp);
}
//再对A进行出队操作就可以获取到栈顶元素
int ret=A.poll();
//将该元素进行插入队列B中
B.offer(ret);
//交换A和B的身份保证下一次插入还是插入到A中
swapAB();
return ret;
}
/** Returns whether the stack is empty. */
public boolean empty() {
return A.isEmpty()&&B.isEmpty();
}
}