剑指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 == ;
} 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)代码覆盖率

剑指Offer面试题:19.包含Min函数的栈的更多相关文章
- 剑指Offer:面试题21——包含min函数的栈(java实现)
问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...
- 剑指offer面试题30.包含min函数的栈
一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...
- 剑指Offer - 九度1522 - 包含min函数的栈
剑指Offer - 九度1522 - 包含min函数的栈2013-12-01 23:44 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测 ...
- 剑指offer(20)包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...
- 剑指offer二十之包含min函数的栈
一.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 二.思路 用一个栈dataStack保存数据,用另外一个栈minStack保存依次入栈最小的数.每次元素存入minSt ...
- 【剑指Offer】20、包含min函数的栈
题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路: 使用两个stack,一个为数据栈,另一个为辅助栈.数据栈 ...
- 【Offer】[30] 【包含min函数的栈】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是0(1). ...
- 《剑指offer》面试题21 包含min函数的栈 Java版
(min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ...
- 《剑指offer》面试题21—包含min函数的栈
题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...
随机推荐
- SQL Server架构 -- 数据库文件和文件组
在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,也是在特定文件夹下创建不同的文件,然后经过文件存储系统去抓取数据信息.理解文件和文件组的概念可以帮 ...
- java的布尔运算符和位运算符
1.布尔运算符 && 逻辑与: || 逻辑或: != 不等于: 三元操作符:?: :表达式为 condition?expression1:expression2(当条件为真时 ...
- c语言快速入门2
如果你想快速入门计算机,可以参考我的上一篇帖子,先了解一些必备的软知识,然后再来进行语言的快速入门 计算机入门基础知识 c语言快速入门1 1.1.12 函数的概念 函数的定义:c语言的基本单位,c语言 ...
- eclipse优化设置
1. Eclipse的控制台console有时候经常的跳出来,非常的烦人! 让它不经常的调出来,可以按下面的操作去掉它: windows -> preferences -> r ...
- Lua笔记
闭包 示例一 function newCounter() return function() -- anonymous function i = i + return i end end c1 = n ...
- switch..case使用
1.多个if...else连在一起使用的时候,可以转为使用更方便的switch结构.switch (XXX) { case "aaa": // ... break; case &q ...
- 初探javascript
javascript是一种在网络广泛应用的脚本语言,虽然名字与java相近,但其实两者并没有直接的关系,脚本语言是一种为了便于操作和拓展功能而开发出来的解释性语言,不同于传统的编程语言,脚本语言不需要 ...
- C#输出文字对齐,空格位数对齐
Align String with Space This example shows how to align strings with spaces. The example formats tex ...
- 也来说说关于未在本地计算机上注册“VFPOLEDB.1”的程序的解决方法
大家都知道VFP是一个非常古老的数据库.但是,还有一些单位用到这些数据库. 前段时间,也做了一个关于DBF数据导出的功能的测试.程序以前有同事写好了,但当我进行修改调试的时候,问题就出来了. 调试的时 ...
- AmazeUI 框架知识点-组件
1.Badge 默认:添加 .am-badge class 到 <div> 或者 <span> 元素. 圆角:在默认样式的基础上添加 .am-radius class. 椭圆: ...