编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。
poll:获取并移除此队列的头,如果此队列为空,则返回 null。
peek:获取但不移除此队列的头;如果此队列为空,则返回 null。
add:将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 illegalStateException。
offer:将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
remove:获取并移除此队列的头。此方法与 poll 唯一的不同在于:此队列为空时将抛出一个异常。
解析:
队列:先进先出
栈:先进后出
使用栈来模拟队列,需要用俩栈来完成。一个作为压入栈stackPush,另一个作为弹出栈stackPop。需要注意两点:
- 1.将stackPush里面的元素压入stackPop栈时,必须一次性的将全部元素压入其中;
2.StackPop不为空时,stackPush不能压入数据。
否则会造成数据的混乱。
代码实现:
package zuochengyun;
import java.util.Stack;
public class SimulationQueue {
public static class Queue{
private Stack<Integer>stackPush;
private Stack<Integer>stackPop;
public Queue(){
this.stackPush = new Stack<Integer>();
this.stackPop = new Stack<Integer>();
}
public void pushToPop() {
if(this.stackPop.empty()) {
while(!this.stackPush.empty()) {
this.stackPop.push(stackPush.pop());
}
}
}
public void add(int pushInt) {
this.stackPush.push(pushInt);
pushToPop();
}
public int poll() {
if(this.stackPop.empty()&&this.stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
}
pushToPop();
return this.stackPop.pop();
}
public int peek() {
if(this.stackPop.empty()&&this.stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
}
pushToPop();
return this.stackPop.peek();
}
}
public static void main(String [] args) {
Stack st1 = new Stack();
st1.add(1);
System.out.println(st1.peek());
System.out.println("---------------------");
st1.add(4);
System.out.println(st1.peek());
System.out.println("---------------------");
st1.add(3);
System.out.println(st1.peek());
}
}
结果: