用两个栈实现队列——剑指Offer
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题目分析
我们先要明确栈和队列的特点,栈最大的特点是先进后出,队列最大的特点是先进先出,因此如何用两个栈来构建一个队列能,我们可以通过下面的例子来分析一下。
我们向模拟的队列插入数 a,b,c 时,假设先把数全部插入 stack1,此时的栈情况为:
栈 stack1:{a,b,c}
栈 stack2:{}
此时我们需要弹出一个数,因为队列是先进先出的特点,a是最先进入的,所以我们应该弹出a,但是在栈stack1中a在最下面,我们要弹出a,首先要弹出b和c,因此我们就需要借助栈stack2,将b和c压入栈stack2,然后栈stack1中就只剩下a元素,直接弹出就好了。
将b和c压入栈stack2中时应该要注意压入栈中的顺序,因为b先入栈stack1,所以b出栈stack1时在c的后面,所以现在情况是:
栈 stack1:{}
栈 stack2:{c,b}
此时如果需要队列做弹出操作,就可以直接弹出栈stack2的栈顶,弹出后情况如下:
栈 stack1:{}
栈 stack2:{c}
若此时需要在队列中插入一个数d,还是选择插入栈stack1,插入后情况为:
栈 stack1:{d}
栈 stack2:{c}
若现在队列要弹出一个数,c 比 d 先进入,c 弹出,注意此时 c 在 stack2 的栈顶,可直接弹出,此时的栈情况为:
栈 stack1:{d}
栈 stack2:{c}
由此我们可以发现一个规律,就是如果队列要插入一个元素都是插入栈stack1,栈stack2作为弹出操作的辅助栈,而如果队列希望弹出一个元素则要分两种情况:1.栈stack2不为空则直接弹出栈stack2的栈顶。2.若栈stack2为空,栈stack1不为空,此时需要将栈stack1中的元素全部压入栈stack2中,然后再弹出栈stack2中的元素。
要点:
1.入队列操作只在栈stack1中进行,出队列操作只在栈stack2中进行。
2.只有在一次性将栈stack1中的元素全部压入栈stack2中后,栈stack2才能进行弹出操作。
import java.util.Stack;
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if(stack2.size()!=0)
{
return stack2.pop();
}
else
{
while(stack1.size()!=0)
stack2.push(stack1.pop());
return stack2.pop();
}
}
下一篇: SQL增删改查语句