/**
* 题目:
* 编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)
* 分析:
* 栈的特点是先进后出,而队列的特点是先进先出,我们可以用两个栈正好能把顺序
* 反过来实现类似队列的操作。
* 具体实现是一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush,
* 另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。
* 因为数据压入栈的时候,顺序是先进后出的,那么只要把stackPush的数据在压入
* stackPop中,顺序就变回来了。
* 要求:
* 1.如果stackPush要往stackPop中压入数据,必须一次性把stackPush中的
* 数据全部压入。
* 2.如果stackPop不为空,stackPush绝对不能想stackPop中压入数据。
* @author 雪瞳
*
*/
* 分析 首先明确Java里面队列的基本知识
Queue: 一个队列就是一个先入先出(FIFO)的数据结构,队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。
* 常用方法
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返回队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
* LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用
* 代码
import java.util.Stack;
public class TwoStacksQueue {
private Stack<Integer> stackPush;
private Stack<Integer> stackPop;
//类的构造方法
public TwoStacksQueue() {
this.stackPop = new Stack<>();
this.stackPush = 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()) {
//当stackPop为空时候才可以向stackPop栈中压入元素
//stackPush一次压入数据必须将stackP内部的所有数据全部压入
while(!stackPush.empty()) {
//获取栈顶数据删除并输出后将元素压入栈stackPop中
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(!stackPush.empty()) {
stackPop.push(stackPush.pop());
}
}
return stackPop.peek();
}
}