问题描述
问题链接:https://leetcode-cn.com/problems/implement-stack-using-queues/
分析
首先我们要明确栈的特点是先进后出,而队列的特点是先进先出,我们不可能用一个队列来完成这个操作,所以我们需要用两个队列来完成。我们主要关心入栈(push)和出栈(pop)即可。
有两个队列,我们时刻要保证一个队列为空,这是解题的关键。
- 入栈push():最开始的情况,两队列都为空,我们随便选一个队列插入元素即可offer(),然后后续要压入元素的话,选择非空的队列入队列即可。(时刻保持一个队列为空)
- 出栈pop():出栈就比较复杂了。我们先将非空队列(假设qu1)中的size-1个元素依次放到另一个空队列中(qu2),此时qu1中只剩最后一个入队列的元素(这个元素最后入队列,但是栈的话最后入栈的要最先出去)所以此时,将qu1的最后一个元素出队列即可poll()(它最后入的栈,却最先出的栈,满足要求)(时刻保持一个队列为空)
- 获取栈顶元素top():和出栈类似,只是有些需要注意的地方,因为获取栈顶元素而不是弹出,我们在出栈的基础上需要移动size个元素了,而且我们要将其保存起来,最后用作返回(保证是栈顶元素)。不然全移完了,最后返回的是最先入栈的元素。(时刻保持一个队列为空)
下面结合图片来理解一下
- 入栈
- 出栈
- 得到栈顶元素
AC代码
class MyStack {
private Queue<Integer> qu1=new LinkedList<>();
private Queue<Integer> qu2=new LinkedList<>();
/** Initialize your data structure here. */
public MyStack() {
}
/** Push element x onto stack. */
public void push(int x) {
if(!qu1.isEmpty())
{
qu1.offer(x);
}else if(!qu2.isEmpty())
{
qu2.offer(x);
}else{
//第一次默认放到qu1当中
qu1.offer(x);
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
if(empty())
{
return -1;
}
if(!qu1.isEmpty())
{
int size=qu1.size()-1;
while(size!=0)
{
qu2.offer(qu1.poll());
size--;
}
return qu1.poll();
}else{
int size=qu2.size()-1;
while(size!=0)
{
qu1.offer(qu2.poll());
size--;
}
return qu2.poll();
}
}
/** Get the top element. */
public int top() {
if(empty())
{
return -1;
}
if(!qu1.isEmpty())
{
int size=qu1.size();
int ret=0;//用作最后返回
while(size!=0)
{
ret=qu1.poll();
qu2.offer(ret);
size--;
}
return ret;
}else{
int size=qu2.size();
int ret=0;
while(size!=0)
{
ret=qu2.poll();
qu1.offer(ret);
size--;
}
return ret;
}
}
/** Returns whether the stack is empty. */
public boolean empty() {
return qu1.isEmpty()&&qu2.isEmpty();
}
}