双栈实现队列
题目要求
提交结果
题目分析
- 栈;先进后出
- 队列:先进先出
根据“负负得正”的原理,所有可以使用双栈实现队列。
比如:
入栈A: 1 2 3
将栈A的所有数据弹出入栈B: 3,2,1
再从B中弹出,最终结果为 1 2 3
和初始顺序一样符合题目要求
具体代码
- 依赖两个栈,push存入的数据在push栈中,从pop栈中弹出数据。
private Stack<Integer> stackPush;
private Stack<Integer> stackPop;
- push方法 :很简单,来了数据,放进push栈即可。
public void push(int x) {
stackPush.push(x);
}
- pop方法:pop的时候,需要先将push栈中的数据全部压入pop栈中,然后从栈顶弹出即可。
public int pop() {
if(stackPop.isEmpty()){
while(!stackPush.isEmpty()){
stackPop.push(stackPush.pop());
}
}
return stackPop.pop();
}
这里有两个很大的局限性:
1.push栈向pop栈压入数据的时候,pop栈中不能有数据。
2.push栈向pop栈压入数据的时候,必须一次性压完。
- peek方法,和pop基本是一样的
public int peek() {
if(stackPop.isEmpty()){
while(!stackPush.isEmpty()){
stackPop.push(stackPush.pop());
}
}
return stackPop.peek();
}
- isEmpty方法:两个栈有一个不为空,则不为空。
/** Returns whether the queue is empty. */
public boolean empty() {
return stackPop.isEmpty() && stackPush.isEmpty();
}
改进pop时的局限性:
待续。。。。。