zoukankan      html  css  js  c++  java
  • 剑指Offer面试题:19.包含Min函数的栈

    一、题目:包含Min函数的栈

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。

      这里我们要实现的就是min、push以及pop三个方法:

        public class MinInStack<T> where T : struct
        {
            private Stack<T> dataStack;
            private Stack<T> minStack;
    
            public MinInStack()
            {
                this.dataStack = new Stack<T>();
                this.minStack = new Stack<T>();
            }
    
            public bool IsEmpty()
            {
                return this.dataStack.Count == 0;
            }
    
            public T Top()
            {
                return this.dataStack.Peek();
            }
    
            public void Push(T item)
            {
            }
    
            public T Pop()
            {
            }
    
            public T Min()
            {
            }
        }

    二、解题思路

    2.1 核心步骤

      把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存起来放到另外一个辅助栈里。下图展示了栈内压入3、4、2、1之后接连两次弹出栈顶数字再压入0时,数据栈、辅助栈和最小值的状态。

      从表中我们可以看出,如果每次都把最小元素压入辅助栈,那么就能保证辅助栈的栈顶一直都是最小元素

    2.2 代码实现

      (1)Push方法

        public void Push(T item)
        {
            // 把新元素添加到数据栈
            dataStack.Push(item);
            // 当新元素比之前的最小元素小时,把新元素插入辅助栈里;
            // 否则把之前的最小元素重复插入辅助栈里
            if (minStack.Count == 0 || item.CompareTo(minStack.Peek()) < 0)
            {
                minStack.Push(item);
            }
            else
            {
                minStack.Push(minStack.Peek());
            }
        }

      (2)Pop方法

        public T Pop()
        {
            T item = dataStack.Pop();
            if(minStack.Count > 0)
            {
                minStack.Pop();
            }
    
            return item;
        }

      (3)Min方法

        public T Min()
        {
            return minStack.Peek();
        }

    三、单元测试

    3.1 测试用例

        [TestMethod]
        public void MinTest1()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            Assert.AreEqual(stack.Min(),3);
        }
    
        [TestMethod]
        public void MinTest2()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            stack.Push(4);
            Assert.AreEqual(stack.Min(), 3);
        }
    
        [TestMethod]
        public void MinTest3()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            stack.Push(4);
            stack.Push(2);
            Assert.AreEqual(stack.Min(), 2);
        }
    
        [TestMethod]
        public void MinTest4()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            stack.Push(4);
            stack.Push(2);
            stack.Push(3);
            Assert.AreEqual(stack.Min(), 2);
        }
    
        [TestMethod]
        public void MinTest5()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            stack.Push(4);
            stack.Push(2);
            stack.Push(3);
            stack.Pop();
            Assert.AreEqual(stack.Min(), 2);
        }
    
        [TestMethod]
        public void MinTest6()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            stack.Push(4);
            stack.Push(2);
            stack.Push(3);
            stack.Pop();
            stack.Pop();
            Assert.AreEqual(stack.Min(), 3);
        }
    
        [TestMethod]
        public void MinTest7()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            stack.Push(4);
            stack.Push(2);
            stack.Push(3);
            stack.Pop();
            stack.Pop();
            stack.Pop();
            Assert.AreEqual(stack.Min(), 3);
        }
    
        [TestMethod]
        public void MinTest8()
        {
            MinInStack<int> stack = new MinInStack<int>();
            stack.Push(3);
            stack.Push(4);
            stack.Push(2);
            stack.Push(3);
            stack.Pop();
            stack.Pop();
            stack.Pop();
            stack.Push(0);
            Assert.AreEqual(stack.Min(), 0);
        }

    3.2 测试结果

      (1)测试通过情况

      (2)代码覆盖率

  • 相关阅读:
    机器学习入门-文本数据-使用聚类增加文本的标签属性
    机器学习入门-文本特征-使用LDA主题模型构造标签 1.LatentDirichletAllocation(LDA用于构建主题模型) 2.LDA.components(输出各个词向量的权重值)
    机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)
    机器学习入门-数值特征-对数据进行log变化
    python中datetime.strptime(),strftime()的应用
    css中的','、'>'、'+'、'~'
    js中const,var,let区别
    css的#和.的区别
    js实现拖放
    [Usaco2005]Part Acquisition
  • 原文地址:https://www.cnblogs.com/edisonchou/p/4777459.html
Copyright © 2011-2022 走看看