剑指Offer的学习笔记(C#篇)-- 包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
一 . 题目该怎么想
1 . 定义栈的数据结构;实现Push、Pop、Top、Min方法;时间复杂度为O(1) 。
思路:定义两个栈。一个存储栈,一个辅助栈。
Push方法:1. 存储栈 -- 正常进栈即可。
2. 辅助栈 -- 先定义一个数(随意,目的是让第一个进栈的数进辅助栈),然后将这个数与之后进栈的数进行比较,当在这之后进栈的数小于这个数的时候,就把他存在辅助栈,若大于等于,则忽略,直接不执行。
Pop方法:1 . 存储栈 -- 正常出栈即可。
2 . 辅助栈 -- 如果存储栈出栈的这个数等于辅助栈将要出栈的数,那么辅助栈出栈,负责不搭理他,也不要出。
Top方法:只需 return stack1.Peek(); 其中stack1表示的是存储栈,这里普及一下(Stack.peek()和Stack.pop()的相同点是 获取栈顶的值,不同点 则是 Stack.peek()只是获取栈顶的值,而Stack.pop()是获取栈顶的值然后删除。)
Min方法:在第二部Pop的时候来一手这个 Min = minstack2.Peek(); ,很稳,其中 minstack2表示的是辅助栈。
来,为了更好的理解,看图咯!!
二 . 代码实现
using System.Collections.Generic; //using泛型集合类List、DIctionary、Queue、Stack、SortedList,若不引用不可运行 class Solution { //定义两个栈,一个存储栈,一个辅助栈 Stack<int> stack1 = new Stack<int>(); Stack<int> minstack2 = new Stack<int>(); //先定义一个最小值Min,其中他的初始状态是int类型中的最大值(单纯的凑数而已,无关紧要) int Min=int.MaxValue; //push方法,首先是存储栈进栈,然后一个if函数,若进栈的这个数比辅助栈里面最小的数还小,则辅助栈也执行进栈 public void push(int node) { stack1.Push(node); if(node<Min) { Min=node; minstack2.Push(node); } } //pop方法,若存储栈pop出的数等于最小值,辅助栈执行POP方法 public void pop() { if(stack1.Pop()== Min) { minstack2.Pop(); Min = minstack2.Peek(); } } //Stack.peek()和Stack.pop()的相同点是 获取栈顶的值, //不同点 则是 Stack.peek()只是获取栈顶的值,而Stack.pop()是获取栈顶的值然后删除。 public int top() { return stack1.Peek(); } //不解释 public int min() { return Min; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构