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());
    }

}

 

原文地址:http://www.cnblogs.com/TheFloorIsNotTooHot/p/16856130.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性