题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。 ```java public class TwoStackToQueue { private Stack stack1; private Stack stack2;

    1. public void appendTail(Integer value) {
    2. }
    3. public Integer deleteHead() {
    4. }

    }

    1. 栈的特点是后进先出,队列的特点是先进先出,如何使用两个栈来实现队列的效果呢? 假设当添加数据时,我们把数据添加到第一个栈中,我们称之为 `stack1`,例如连续添加 `1, 2, 3, 4` 四个数据,如下
    2. ![](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)
    3. 我们添加数据时向 `stack1` 添加数据,而取出数据时从 `stack2` 取出数据,我们再次把 `stack1` 中的数据依次放入 `stack2` 中,经过两次入栈的操作,两个后进先出变成了先进先出
    4. ![](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)
    5. 现在我们入队和出队的规则应该如下,即入队时将数据压入 `stack1` 中,出队时从 `stack2` 中弹出,现在的问题是什么时候将 `stack1` 中的数据弹出压入到 `stack2` 中,其实很简单,出队时将 `stack2` 中的数据弹出,直到 `stack2` 为空,这时将 `stack1` 中的数据弹出压入到 `stack2` 中,然后从 `stack2` 弹出数据。下面演示一个完整的例子
    6. ![](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)
    7. 完整的代码示例如下
    8. ```java
    9. import java.util.Stack;
    10. public class TwoStackToQueue {
    11. private static Stack<Integer> stack1 = new Stack<>();
    12. private static Stack<Integer> stack2 = new Stack<>();
    13. public static void appendTail(Integer value) {
    14. // 添加数据从 stack1 添加
    15. stack1.push(value);
    16. }
    17. public static Integer deleteHead() {
    18. // stack2 不为空时 从stack2 弹出数据
    19. if (!stack2.isEmpty()) {
    20. return stack2.pop();
    21. } else {
    22. // stack2 为空时 且stack1 不为空时,将stack1的数据弹出压入到stack2中
    23. if (!stack1.isEmpty()) {
    24. while (!stack1.isEmpty()) {
    25. stack2.push(stack1.pop());
    26. }
    27. // 然后从 stack2 弹出数据
    28. return stack2.pop();
    29. } else {
    30. // stack1 和 stack2 都为空,说明队列为空 抛出异常
    31. throw new RuntimeException("Queue is Empty");
    32. }
    33. }
    34. }
    35. }