zoukankan      html  css  js  c++  java
  • 设计含有Min函数的栈

    题目:定义栈的数据结构,要求加一个min函数,能够找得到栈的最小元素。

    要求函数min、push以及pop的时间复杂度都是O(1)  。

    思路:栈的数据结构,是先进后出(后进先出),本身push和pop的时间复杂度就是O(1)。得到栈的最小元素,有两种方案:1,可以遍历栈的所有元素,找到最小元素,这种方案的时间复杂度为O(n)空间复杂度为O(1) ;2,是采用空间换时间的方法,栈的每个元素的数据结构出来保存自身的值之外,还要保存以这个元素为栈顶的情况下,min元素的值。

    class MinElement
    {
      public int value;
      public int minValue;
    }

    这样的数据结构把原来N的存储空间变为2N,在实际过程中,对于Stack A,它的min 为 a,这个时候新增一个元素b,当bvalue值大于min时,b对应的minvalue值为min是不变的,minValue存储很多重复的值,因此可以把minValue和vlaue分开,重新使用一个堆栈保存栈的minValue

    定义一个堆栈minStack用来保存栈的minvalue,stack保存栈的值。

    stack当push一个元素a时,minStack是否改变的条件如下:

    1 当stack为空时,minStack直接把a入栈。
     

     2当stack非空时,b为minStack的栈顶元素,当a<=b时(一定要注意=号,否则出栈就会出现问题),a入栈,否则不入栈。

    stack当pop一个元素a时,minStack是否改变的条件如下:

    1,b为minStack的栈顶元素,如果a<=b,则出栈,否则不出栈。

    min函数返回的值就是,minStack的栈顶值

    这样的数据结构,在stack在push和pop元素时,都需要进行比较,而采用MinElement数据结构的栈,只需要在push元素时进行比较,pop时不需要比较。

    当stack中push的元素都是一样的或者递减时,stack的空间消耗和MinElement一样,都需要额外的N的存储空间。

    根据我的测试,随机生成10000个数据,入栈时,minStack的元素个数和stack的元素个数大概1:1000(两个堆栈的空间比为9.765625E-4),因此还是比较节省空间的。

    下面是java代码:

    import java.util.EmptyStackException;
    import java.util.Stack;
    
    public class MinStack {
        private Stack<Integer> stackValue;
        private Stack<Integer> stackMinValue;
        public MinStack()
        {
            stackValue=new Stack<Integer>();
            stackMinValue=new Stack<Integer>();
        }
        public void push(int item)
        {
            if(stackValue.empty())
            {
                stackValue.push(item);
                stackMinValue.push(item);
            }
            else
            {
                stackValue.push(item);
                if(item<=stackMinValue.peek())
                {
                    stackMinValue.push(item);
                }
            }
            
        }
        public int pop()
        {
            if(stackValue.empty())
            {
                System.out.println("堆栈为空!!!");
                return Integer.MIN_VALUE;
            }
            else
            {
                int item=stackValue.pop();
                if(item==stackMinValue.peek())
                {
                    stackMinValue.pop();
                }
                return item;
            }
        };
        public int peep()
        {
            try
            {
                return stackValue.peek();
            }catch(EmptyStackException e)
            {
                e.printStackTrace();
            }
            return Integer.MIN_VALUE;
        };
        public int peepMin()
        {
            try
            {
                return stackMinValue.peek();
            }catch(EmptyStackException e)
            {
                e.printStackTrace();
            }
            return Integer.MIN_VALUE;
    
        };
        public boolean empty()
        {
            return stackValue.empty();
        }
        public void clear()
        {
            stackValue.clear();
            stackMinValue.clear();
        }
        public int capacity()
        {
            return stackValue.capacity();
        }
        public int minCapacity()
        {
            return stackMinValue.capacity();
        }
    }

                                                            菜包子                                                                                                                                                                                                                          2013年5月13日15:19:57 于马甸桥东

  • 相关阅读:
    java FileI(O)nputStream为什么比BufferedI(O)utputStream慢?
    JDBC 关于大文本数据
    JDBC 关于Date格式
    JDBC 增删改查代码 过滤查询语句
    JavaBean与JSP
    配置tomcat映射jsp
    【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】
    【Xamarin挖墙脚系列:多窗口之间的导航】
    【Xamarin挖墙脚系列:Xamarin.IOS的程序的结构】
    【Xamarin挖墙脚系列:在VMware11中安装Mac10.11 EI Captain后的vmware tools】
  • 原文地址:https://www.cnblogs.com/CaiBaoZi/p/3075778.html
Copyright © 2011-2022 走看看