题目描述
编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)
问题解答
要实现队列的先进先出功能,对于一个元素,它先进一个第一个栈,出时会后出,此时,再将其压入第二个栈,便会成为后进先出了,此时顺序就成为了先进先出了。
大体上思路是这样,但是分别考虑这三个方法(add,poll,peek),会发现很多细节之处需要考虑。add方法其实没有什么细节考虑
对于poll方法,当第一次poll后,会把第一个栈所有的元素都压入到第二个栈中,此时从第二个栈中poll,但是之后当再往第一个栈中压入元素后,当再次要求poll后,此时就会面临以下两种情况
1 第二个栈为空,此时,直接将第一个栈的元素压入第二个栈并poll就行
2 第二个栈为非空,则主要将第二个栈的元素直接pop就好
对于peek方法,考虑情况时和poll类似,这里就不详细解释了
代码如下
import java.util.Stack;
public class StackAndQueue {
public Stack<Integer> stackPush;
public Stack<Integer> stackPop;
public StackAndQueue(){
stackPush = new Stack<Integer>();
stackPop = new Stack<Integer>();
}
public void add(int num){
stackPop.push(num);
}
public int poll(){
if(stackPop.isEmpty()){
if(stackPush.isEmpty()){
throw new RuntimeException("Queue is empty");
}else{
while(!stackPush.isEmpty()){
stackPop.push(stackPush.pop());
}
}
}
return stackPop.pop();
}
public int peek(){
if(stackPop.isEmpty()){
if(stackPush.isEmpty()){
throw new RuntimeException("Queue is empty");
}else{
while(!stackPush.isEmpty()){
stackPop.push(stackPush.pop());
}
}
}
return stackPop.peek();
}
}
网友评论