package class03;
import java.util.Stack;
/**
* 用栈结构,实现队列结构。
* (特殊问法:用栈来实现图的宽度优先遍历,用队列来实现图的深度优先遍历)
*/
public class Code06_DoubleStackImplementQueue {
/**
* 两个栈实现队列
*/
public static class TwoStackQueue {
public Stack<Integer> pushStack;//压入栈,用于存放添加的元素。
public Stack<Integer> popStack;//弹出栈,用于从这里弹出元素。
public TwoStackQueue() {
pushStack = new Stack<>();
popStack = new Stack<>();
}
//将压入栈的所有元素一次性,导入到弹出栈。必须是一次性。
private void pushToPop() {
if (popStack.empty()) {
while (!pushStack.empty()) {//只要压入栈要有元素,就将压入栈的元素,添加到弹出栈。
popStack.push(pushStack.pop());
}
}
}
//添加元素
public void add(Integer value) {
pushStack.push(value);//向压入栈中压入一个元素
pushToPop();//添加完元素后,检查是否可以倒元素了,如果可以,就一次性倒完。
}
//弹出元素
public Integer poll() {
if (pushStack.empty() && popStack.empty()) {
throw new RuntimeException("your queue is empty!");
}
pushToPop();//弹出元素前,先检查,是否可以倒元素了。
return popStack.pop();//从弹出栈中弹出一个元素
}
//获取弹出栈的栈顶的值,但是不弹出元素。
public Integer peek() {
if (pushStack.empty() && popStack.empty()) {
throw new RuntimeException("your queue is empty!");
}
pushToPop();//获取值之前,先检查是否可以倒元素了。
return popStack.peek();//获取值
}
}
public static void main(String[] args) {
TwoStackQueue twoStackQueue = new TwoStackQueue();
twoStackQueue.add(1);
twoStackQueue.add(2);
twoStackQueue.add(3);
System.out.println(twoStackQueue.peek());
System.out.println(twoStackQueue.poll());
System.out.println(twoStackQueue.peek());
System.out.println(twoStackQueue.poll());
twoStackQueue.add(4);
System.out.println(twoStackQueue.peek());
System.out.println(twoStackQueue.poll());
System.out.println(twoStackQueue.peek());
System.out.println(twoStackQueue.poll());
// System.out.println(twoStackQueue.poll());
}
}
![]()