由两个栈组成的队列
【题目】
编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)
【思路】
栈的特点是先进后出,队列的特点是先进先出,
在进行poll和peek操作之前需要判断两个栈是否都为空:
若都为空则抛出异常
若转换栈为空,则将原始栈中元素弹出,并压入转换栈中
否则直接进行poll和peek操作
在压入数据时只需要压入原始栈即可,当转换栈中弹空后,才在下次操作时进行转换操作
package com.javaman.chap1;
import java.util.Stack;
public class TwoStackQueue {
private Stack<Integer> stackPush;
private Stack<Integer> stackPop;
public TwoStackQueue(){
this.stackPush = new Stack<>();
this.stackPop = new Stack<>();
}
public void add(int pushInt){
stackPush.push(pushInt);
}
public int poll(){
if(stackPop.empty()&&stackPush.empty()){
throw new RuntimeException("Queue is empty");
}else if(stackPop.empty()){
while(!stackPush.empty()){
stackPop.push(stackPush.pop());
}
}
return stackPop.pop();
}
public int peek(){
if(stackPop.empty()&&stackPush.empty()){
throw new RuntimeException("Queue is empty");
}else if(stackPop.empty()){
while(!stackPop.empty()){
stackPop.push(stackPush.pop());
}
}
return stackPop.peek();
}
public static void main(){
TwoStackQueue twoStackQueue = new TwoStackQueue();
twoStackQueue.add(1);
twoStackQueue.add(2);
twoStackQueue.add(3);
twoStackQueue.add(4);
twoStackQueue.add(5);
System.out.println(twoStackQueue.poll());
System.out.println(twoStackQueue.peek());
}
}
阅读总结
栈转队列时需要两个栈进行转换。
当转换栈为空时,才能从原始栈中弹出数据压入站换栈
函数:
poll() 队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除