题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数
appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。 ```java public class TwoStackToQueue { private Stackstack1; private Stack stack2;
public void appendTail(Integer value) {}public Integer deleteHead() {}
}
栈的特点是后进先出,队列的特点是先进先出,如何使用两个栈来实现队列的效果呢? 假设当添加数据时,我们把数据添加到第一个栈中,我们称之为 `stack1`,例如连续添加 `1, 2, 3, 4` 四个数据,如下我们添加数据时向 `stack1` 添加数据,而取出数据时从 `stack2` 取出数据,我们再次把 `stack1` 中的数据依次放入 `stack2` 中,经过两次入栈的操作,两个后进先出变成了先进先出现在我们入队和出队的规则应该如下,即入队时将数据压入 `stack1` 中,出队时从 `stack2` 中弹出,现在的问题是什么时候将 `stack1` 中的数据弹出压入到 `stack2` 中,其实很简单,出队时将 `stack2` 中的数据弹出,直到 `stack2` 为空,这时将 `stack1` 中的数据弹出压入到 `stack2` 中,然后从 `stack2` 弹出数据。下面演示一个完整的例子完整的代码示例如下```javaimport 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");}}}}
