题目:
用两个栈实现队列,支持队列的add、poll、peek操作
思路:
两个栈,一个用于每次向里面添加元素,另一个用于弹出元素,弹出规则是:若栈不为空,则直接弹出;若为空,则将第一个栈的所有元素都移动到这个栈,再弹出/输出栈顶元素。进而实现用两个栈的先进后出来模拟队列的先进先出
Java实现:
import java.util.Stack;
public class Main {
public Stack<Integer> stackPush;
public Stack<Integer> stackPop;
public Main(){
stackPush=new Stack<Integer>();
stackPop=new Stack<Integer>();
}
public void add(int val){
stackPush.push(val);
}
public int poll(){
if(stackPush.empty()&&stackPop.empty())
throw new RuntimeException("Queue is empty.");
//若stackPop为空,则将stackPush中的元素全部移动到栈stackPop中
else if(stackPop.empty()){
while(!stackPush.empty())
stackPop.push(stackPush.pop());
}
//pop stackPop的栈顶元素
return stackPop.pop();
}
public int peek(){
if(stackPop.empty()&&stackPush.empty())
throw new RuntimeException("Queue is empty.");
//若stackPop为空,则将stackPush中的元素全部移动到栈stackPop中
else if(stackPop.empty()){
while(!stackPush.empty())
stackPop.push(stackPush.pop());
}
//输出stackPop的栈顶元素
return stackPop.peek();
}
public static void main(String[] args) {
Main myStack=new Main();
myStack.add(4);
myStack.add(2);
myStack.add(1);
System.out.println(myStack.peek());
System.out.println(myStack.poll());
System.out.println(myStack.peek());
}
}
参考:《程序员代码面试指南》