一、题目:包含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 == ;
} 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 == || item.CompareTo(minStack.Peek()) < )
{
minStack.Push(item);
}
else
{
minStack.Push(minStack.Peek());
}
}

  (2)Pop方法

    public T Pop()
{
T item = dataStack.Pop();
if(minStack.Count > )
{
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();
Assert.AreEqual(stack.Min(),);
} [TestMethod]
public void MinTest2()
{
MinInStack<int> stack = new MinInStack<int>();
stack.Push();
stack.Push();
Assert.AreEqual(stack.Min(), );
} [TestMethod]
public void MinTest3()
{
MinInStack<int> stack = new MinInStack<int>();
stack.Push();
stack.Push();
stack.Push();
Assert.AreEqual(stack.Min(), );
} [TestMethod]
public void MinTest4()
{
MinInStack<int> stack = new MinInStack<int>();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
Assert.AreEqual(stack.Min(), );
} [TestMethod]
public void MinTest5()
{
MinInStack<int> stack = new MinInStack<int>();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Pop();
Assert.AreEqual(stack.Min(), );
} [TestMethod]
public void MinTest6()
{
MinInStack<int> stack = new MinInStack<int>();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Pop();
stack.Pop();
Assert.AreEqual(stack.Min(), );
} [TestMethod]
public void MinTest7()
{
MinInStack<int> stack = new MinInStack<int>();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Pop();
stack.Pop();
stack.Pop();
Assert.AreEqual(stack.Min(), );
} [TestMethod]
public void MinTest8()
{
MinInStack<int> stack = new MinInStack<int>();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Pop();
stack.Pop();
stack.Pop();
stack.Push();
Assert.AreEqual(stack.Min(), );
}

3.2 测试结果

  (1)测试通过情况

  (2)代码覆盖率

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

剑指Offer面试题:19.包含Min函数的栈的更多相关文章

  1. 剑指Offer:面试题21——包含min函数的栈(java实现)

    问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...

  2. 剑指offer面试题30.包含min函数的栈

    一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...

  3. 剑指Offer - 九度1522 - 包含min函数的栈

    剑指Offer - 九度1522 - 包含min函数的栈2013-12-01 23:44 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测 ...

  4. 剑指offer(20)包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...

  5. 剑指offer二十之包含min函数的栈

    一.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 二.思路 用一个栈dataStack保存数据,用另外一个栈minStack保存依次入栈最小的数.每次元素存入minSt ...

  6. 【剑指Offer】20、包含min函数的栈

      题目描述:   定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).   解题思路:   使用两个stack,一个为数据栈,另一个为辅助栈.数据栈 ...

  7. 【Offer】[30] 【包含min函数的栈】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是0(1). ...

  8. 《剑指offer》面试题21 包含min函数的栈 Java版

    (min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ...

  9. 《剑指offer》面试题21—包含min函数的栈

    题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...

随机推荐

  1. JS隐形数据类型转换注意事项

    alert('2'===2); //这个结果是false,首先三个等号要比较数据类型,字符串和整数不相等 alert('2'==2);    //这个结果是true,因为是两个等号,所以不会比较数据类 ...

  2. python调用c\c++

    前言 python 这门语言,凭借着其极高的易学易用易读性和丰富的扩展带来的学习友好性和项目友好性,近年来迅速成为了越来越多的人们的首选.然而一旦拿python与传统的编程语言(C/C++)如来比较的 ...

  3. 【Hawk】入门教程(1)——从URL开始

    入门教程(1)--从URL开始 首先感谢辛苦的沙漠君 先把沙漠君的教程载过来:)可以先看一遍 Hawk-数据抓取工具:简明教程 Hawk 数据抓取工具 使用说明(二) 20分钟无编程抓取大众点评17万 ...

  4. 最详细易懂的CRC-16校验原理(附源程序)(转)

    最详细易懂的CRC-16校验原理(附源程序) from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CR ...

  5. dedecms循环列表样式

    简单用法: {dede:arclist typeid="1" row="} <li class="list[field:global.autoindex/ ...

  6. iOS Start developing ios apps (OC) pdf

    这是苹果官方最后一次更新的基于OC的iOS开发基础教程, 如果英文的看不懂,还有中文的版本哦. 点击下面的链接 好东西,分享给大家! 如果确实有帮到你,麻烦star一下我的github吧!

  7. 转载:安装ie driver和chrome driver

    很多同学在使用webdriver的时候总是忘了安装ie driver和chrome driver, 因此在这里简单介绍一下这2个driver的安装方式. IE driver 在新版本的webdrive ...

  8. mac linux 删除一个文件下边所有文件和文件夹

    sudo rm -r -f 目录

  9. 【BZOJ】4245: [ONTAK2015]OR-XOR

    题意 给定一个长度为\(n(1 \le n \le 500000)\)的序列\(a_i(0 \le a_i \le 10^{18})\),将它划分为\(m(1 \le m \le n)\)段连续的区间 ...

  10. 【BZOJ1415】 [Noi2005]聪聪和可可 概率与期望

    其实题不难,不知提交了几次...不能代码MD...注意一些基本问题...SB概率题 #include <iostream> #include <cstdio> #include ...