使用栈结构实现队列结构, 即: 外部表现的是一个队列
操作:
1.准备两个栈: push pop, push栈负责数据的首次存储,pop栈负责弹出以达到队列的效果
2.只要pop栈不为空,不能pushToPop
可能出现的问题: 压栈到pushStack时,由于popStack已经不为空了,那么就需要后续在进行pop或者 peek时执行 pushToPop操作,即让pushStack中的数据倒入popStack中
public class StackImplementQueue {
private final Stack<Integer> pushStack;
private final Stack<Integer> popStack;
public StackImplementQueue() {
this.pushStack = new Stack<>();
this.popStack = new Stack<>();
}
public void push(int val){
pushStack.push(val);
//有可能有数据但没有进入popStack
pushToPop();
}
public int pop(){
//有可能有数据但没有进入popStack
if(popStack.empty() && pushStack.empty()){
throw new RuntimeException("queue is empty!");
}
//有可能有数据但没有进入popStack
pushToPop();
return popStack.pop();
}
public int peek(){
if(pushStack.empty() && popStack.empty()){
throw new RuntimeException("queue is empty!");
}
//有可能有数据但没有进入popStack
pushToPop();
return popStack.peek();
}
private void pushToPop(){
if(popStack.empty()){
while (!pushStack.empty()){
popStack.push(pushStack.pop());
}
}
}
}
左神算法学习