请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
链接:https://leetcode-cn.com/problems/implement-stack-using-queues
解决办法,利用两队列先进先出的特点,假设当前有两个队列A,B,先将n个数据放入队列A中,若执行出栈操作,则先将前n-1个数据放入B中,然后A出队,并存入临时变量中,返回该临时变量,此时若继续执行入栈操作,则先将m个数据放入A中,然后将A中m-1个数据存入B中,输出A的最后一个元素,还有其他情况需要考虑,看代码。
class MyStack {
Queue<Integer> queue1 = null;
Queue<Integer> queue2 =null;
/** Initialize your data structure here. */
public MyStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
/** Push element x onto stack. */
public void push(int x) {
queue1.offer(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
if(queue2.size()==0){
while(queue1.size()>1){
int num = queue1.poll();
queue2.offer(num);
}
return queue1.poll();
}
if(queue1.size()==0){
while(queue2.size()>1){
int num = queue2.poll();
queue1.offer(num);
}
return queue2.poll();
}
if(queue2.size()!=0 && queue1.size()!=0){
while(queue1.size()>1){
int num = queue1.poll();
queue2.offer(num);
}
return queue1.poll();
}
return queue1.poll();
}
/** Get the top element. */
public int top() {
int num = 0;
if(queue2.size()==0){
while(queue1.size()>0){
num = queue1.poll();
queue2.offer(num);
}
return num;
}
else if(queue1.size()==0){
while(queue2.size()>0){
num = queue2.poll();
queue1.offer(num);
}
return num;
}
else{
while(queue1.size()>0){
num = queue1.poll();
queue2.offer(num);
}
return num;
}
}
/** Returns whether the stack is empty. */
public boolean empty() {
if(queue1.isEmpty()&&queue2.isEmpty()){
return true;
}
else{
return false;
}
}
}