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

  • 相关阅读:
    C#多线程学习
    什么是启发式算法(转)
    进程与线程的一个简单解释
    Fedora19/18/17安装显卡驱动和无限网卡驱动
    MySQL性能优化的最佳20+条经验
    npm使用笔记
    函数式编程--curry化
    读js语言精粹收获
    如何解决mysql数据注入网站时中文字符显示问号
    如何实现区域内横向滚动条?
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9854499.html
Copyright © 2020-2023  润新知