题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数
appendTail
和deleteHead
,分别完成在队列尾部插入节点和在队列头部删除节点的功能。 ```java public class TwoStackToQueue { private Stackstack1; private Stack stack2;
public void appendTail(Integer value) {
}
public Integer deleteHead() {
}
}
栈的特点是后进先出,队列的特点是先进先出,如何使用两个栈来实现队列的效果呢? 假设当添加数据时,我们把数据添加到第一个栈中,我们称之为 `stack1`,例如连续添加 `1, 2, 3, 4` 四个数据,如下
![](https://gitee.com/lastknightcoder/blogimage/raw/master/img/20200604102923.png#align=left&display=inline&height=123&margin=%5Bobject%20Object%5D&originHeight=238&originWidth=779&status=done&style=none&width=403)
我们添加数据时向 `stack1` 添加数据,而取出数据时从 `stack2` 取出数据,我们再次把 `stack1` 中的数据依次放入 `stack2` 中,经过两次入栈的操作,两个后进先出变成了先进先出
![](https://gitee.com/lastknightcoder/blogimage/raw/master/img/20200604103625.png#align=left&display=inline&height=193&margin=%5Bobject%20Object%5D&originHeight=314&originWidth=987&status=done&style=none&width=608)
现在我们入队和出队的规则应该如下,即入队时将数据压入 `stack1` 中,出队时从 `stack2` 中弹出,现在的问题是什么时候将 `stack1` 中的数据弹出压入到 `stack2` 中,其实很简单,出队时将 `stack2` 中的数据弹出,直到 `stack2` 为空,这时将 `stack1` 中的数据弹出压入到 `stack2` 中,然后从 `stack2` 弹出数据。下面演示一个完整的例子
![](https://gitee.com/lastknightcoder/blogimage/raw/master/img/20200604110658.png#align=left&display=inline&height=1226&margin=%5Bobject%20Object%5D&originHeight=2069&originWidth=1141&status=done&style=none&width=676)
完整的代码示例如下
```java
import java.util.Stack;
public class TwoStackToQueue {
private static Stack<Integer> stack1 = new Stack<>();
private static Stack<Integer> stack2 = new Stack<>();
public static void appendTail(Integer value) {
// 添加数据从 stack1 添加
stack1.push(value);
}
public static Integer deleteHead() {
// stack2 不为空时 从stack2 弹出数据
if (!stack2.isEmpty()) {
return stack2.pop();
} else {
// stack2 为空时 且stack1 不为空时,将stack1的数据弹出压入到stack2中
if (!stack1.isEmpty()) {
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
// 然后从 stack2 弹出数据
return stack2.pop();
} else {
// stack1 和 stack2 都为空,说明队列为空 抛出异常
throw new RuntimeException("Queue is Empty");
}
}
}
}