剑指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)代码覆盖率
分类:
【012】计算机专业基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix