zoukankan      html  css  js  c++  java
  • Algs4-1.4.31三个栈实现的双向队列

    1.4.31三个栈实现的双向队列。使用三个栈实现一个双向队列,使得双向队列的每个操作所需的栈操作均摊后为一个常数。
    答:
    图片
    public class E1d4d31<Item>
    {
        Stack<Item> sLeft=new Stack<Item>();
        Stack<Item> sRight=new Stack<Item>();
        Stack<Item> sTemp=new Stack<Item>();
        boolean TempIsRight=false;//false表示中转栈存的是左栈数据,true表示中转栈存右栈数据。
        //
        public boolean isEmpty()
        {
            return sLeft.isEmpty() && sRight.isEmpty()&&sTemp.isEmpty();
        }
       
        public int size()
        {
            return sLeft.size()+sRight.size()+sTemp.size();
        }
       
        public void pushLeft(Item item)
        {
            sLeft.push(item);
        }
       
        public Item popLeft()
        {
            if(!sLeft.isEmpty())
                return sLeft.pop();//左栈有内容时直接弹出
            else if(!sTemp.isEmpty() && TempIsRight)//左栈无内容,中转栈有内容,中转栈是右栈内容时,从中转栈中弹出
                return sTemp.pop();
            else if(!sTemp.isEmpty() && !TempIsRight)//左栈无内容,中转栈有内容,中转栈是左栈内容时,把中转栈内容全部倒入左栈,然后从左栈弹出
            {
                while(!sTemp.isEmpty())
                     sLeft.push(sTemp.pop());
               return sLeft.pop();
            }
            else if(sTemp.isEmpty() && !sRight.isEmpty())//左栈无内容,中转栈无内容,右栈有内容,把右栈内容全部倒入中转栈,中转栈存入内容标记为右栈,然后从中转栈弹出。
            {
                while(!sRight.isEmpty())
                    sTemp.push(sRight.pop());
                TempIsRight=true;
                return sTemp.pop();
            }
            else//左栈无内容,中转栈无内容,右栈无内容时,弹出null
            {
                return null;
            }
       }
       
        public void pushRight(Item item)
        {
            sRight.push(item);
        }
       
        public Item popRight()//与popLeft原理相同
        {
            if(!sRight.isEmpty())
                return sRight.pop();
            else if(!sTemp.isEmpty() && !TempIsRight)
                return sTemp.pop();
            else if(!sTemp.isEmpty() && TempIsRight)
            {
                while(!sTemp.isEmpty())
                     sRight.push(sTemp.pop());
               return sRight.pop();
            }
            else if(sTemp.isEmpty() && !sLeft.isEmpty())
            {
                while(!sLeft.isEmpty())
                    sTemp.push(sLeft.pop());
                TempIsRight=false;
                return sTemp.pop();
            }
            else
            {
                return null;
            }
        }
       
       
        public static void main(String[] args)
        {
            E1d4d31<String> d=new E1d4d31<String>();
            d.pushLeft("1");
            d.pushRight("2");
            StdOut.printf("Deque size is:%d ",d.size());
            StdOut.printf("popLeft is:%s ",d.popLeft());
            StdOut.printf("popLeft is:%s ",d.popLeft());
            //
            d.pushLeft("1");
            d.pushRight("2");
            StdOut.println("-------");
            StdOut.printf("Deque size is:%d ",d.size());
            StdOut.printf("popRight is %s ",d.popRight());
            StdOut.printf("popRight is %s ",d.popRight());
            //
            d.pushLeft("1");
            d.pushRight("2");
            d.pushRight("3");
            StdOut.println("-------");
            StdOut.printf("popLeft is:%s ",d.popLeft());
            StdOut.printf("popLeft is:%s ",d.popLeft());
            d.pushRight("4");
            StdOut.printf("popRight is %s ",d.popRight());
            StdOut.printf("popRight is %s ",d.popRight());
             StdOut.printf("popRight is %s ",d.popRight());
        }
    }

  • 相关阅读:
    linux LTIB学习笔记
    wince WaitForMultipleObjects需要注意的问题
    微信小程序在苹果上出现[request:fail 发生了 SSL 错误无法建立与该服务器的安全连接。]错误的解决方案
    Windows 2008之PKI实战4:吊销
    十个不找工作的理由
    [zt]我奋斗了18年不是为了和你一起喝咖啡
    [zt]Java/PHP/C 几种语言 RSA 的互操作
    全职共享和兼职的一些思考pkill
    定价策略(翻译稿)
    Windows 2008之PKI实战1:管理
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9854499.html
Copyright © 2011-2022 走看看