栈:先入后出,后入先出

像电梯一样,先进入电梯的,走到电梯最深处,后进入电梯的,站在电梯门口,

所以电梯打开的时候,后进入的会先走出来,先进入的会后走出来。

  • push,对应入电梯,把数据往里面压
  • pop, 对应出电梯,把数据往外拿
  • 栈顶,对应电梯门口
  • 栈底,对应电梯最深处

这里使用链表实现栈。

先创建一个MinStack头,

入栈:直接把结构体挂在MinStack头后面,

出栈:直接拿出MinStack头后面的结构体。

取最小值:对链表进行一次遍历,返回最小值。

typedef struct minstack{
struct minstack *pNext;
int val;
} MinStack; /** initialize your data structure here. */ MinStack* minStackCreate() { // 创建一个 minStack 头
MinStack *pstTemp = NULL;
pstTemp = (MinStack *)calloc(1, sizeof(MinStack));
if (NULL == pstTemp)
return NULL;
pstTemp->pNext = NULL;
return pstTemp;
} void minStackPush(MinStack* obj, int x) { // 入栈
MinStack *pstTemp = NULL;
if (NULL == obj)
return;
pstTemp = (MinStack *)calloc(1, sizeof(MinStack));
if (NULL == pstTemp)
return;
pstTemp->val = x;
pstTemp->pNext = obj->pNext;
obj->pNext = pstTemp;
return;
} void minStackPop(MinStack* obj) { // 出栈
MinStack *pstTemp = NULL;
if ((NULL == obj) || (NULL == obj->pNext))
return;
pstTemp = obj->pNext;
obj->pNext = pstTemp->pNext;
free(pstTemp);
pstTemp = NULL;
return;
} int minStackTop(MinStack* obj) {
MinStack *pstTemp = NULL;
if ((NULL == obj) || (NULL == obj->pNext))
return;
pstTemp = obj->pNext;
return pstTemp->val;
} int minStackGetMin(MinStack* obj) {
MinStack *pstTemp = NULL;
int iMin = 0;
if ((NULL == obj) || (NULL == obj->pNext)) // 这里如果确实是一个空链表的话,返回0的话好像也不太对
return iMin;
else
{
pstTemp = obj->pNext;
iMin = pstTemp->val; // 这里需要使用栈里面值初始化一下iMin,万一栈里面所有的值都大于0,就会返回最小值为0,就错了
pstTemp = pstTemp->pNext;
}
while(NULL != pstTemp)
{
if (pstTemp->val < iMin)
iMin = pstTemp->val;
pstTemp = pstTemp->pNext;
}
return iMin;
} void minStackFree(MinStack* obj) {
MinStack *pstNow = NULL;
MinStack *pstNext = NULL;
if ((NULL == obj) || (NULL == obj->pNext))
return;
pstNow = obj->pNext;
while(NULL != pstNow)
{
pstNext = pstNow->pNext;
free(pstNow);
pstNow = NULL;
pstNow = pstNext;
}
return;
} /**
* Your MinStack struct will be instantiated and called as such:
* MinStack* obj = minStackCreate();
* minStackPush(obj, x); * minStackPop(obj); * int param_3 = minStackTop(obj); * int param_4 = minStackGetMin(obj); * minStackFree(obj);
*/

leadcode的Hot100系列--155. 最小栈的更多相关文章

  1. leadcode的Hot100系列--64. 最小路径和--权值最小的动态规划

    如果这个: leadcode的Hot100系列--62. 不同路径--简单的动态规划 看懂的话,那这题基本上是一样的, 不同点在于: 1.这里每条路径相当于多了一个权值 2.结论不再固定,而是要比较不 ...

  2. leadcode的Hot100系列--17. 电话号码的字母组合--回溯的另一种想法的应用

    提交leetcode的时候遇到了问题,一直说访问越界,但仔仔细细检查n多遍,就是检查不出来. 因为我用到了count全局变量,自加一来表明当前数组访问的位置, 后来突然想到,是不是在leetcode在 ...

  3. Java实现 LeetCode 155 最小栈

    155. 最小栈 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) – 将元素 x 推入栈中. pop() – 删除栈顶的元素. top() – 获取 ...

  4. 【LeetCode】155. 最小栈

    155. 最小栈 知识点:栈:单调 题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删 ...

  5. leetcode算法学习----155. 最小栈(MinStack )

    下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...

  6. LeetCode 155 - 最小栈 - [数组模拟栈]

    题目链接:https://leetcode-cn.com/problems/min-stack/description/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的 ...

  7. LeetCode 刷题笔记 155. 最小栈(Min Stack)

    tag: 栈(stack) 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素 ...

  8. Leetcode题目155.最小栈(简单)

    题目描述: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶 ...

  9. leetcode 155. 最小栈(c++)

    设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶元素.get ...

随机推荐

  1. WPF中样式和行为和触发器

    原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细 ...

  2. WPF HeaderedContentControl两个内容属性 Header和Content

    <Window x:Class="XamlTest.Window2"        xmlns="http://schemas.microsoft.com/winf ...

  3. WPF 数据库增删改查

    <Window x:Class="DataBindingExam.MainWindow"        xmlns="http://schemas.microsof ...

  4. inno setup 打包说明

     [Setup] 这个段包含用于安装程序和卸载程序的全局设置 AppId:在注册表中唯一的项名称,安装完64位系统在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\M ...

  5. 【windows】常见的系统环境变量,如%appdata%表示什么意思

    原文:[windows]常见的系统环境变量,如%appdata%表示什么意思 1.介绍 %appdata%就代表了C:Users\用户名\AppData\Roaming这个文件夹. “%”是系统变量的 ...

  6. JS引用路劲为什么在前面加上两个斜杠

    原文:JS引用路劲为什么在前面加上两个斜杠 //表示同协议,一般现在用在https跨域名地址情况下.比如第三方统计代码的引入,用//就不用很麻烦地区分https还是http,也不用担心https下降到 ...

  7. 超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题

    原文:超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题 转载标明出处:http://blog.csdn.net/u012861467 前方高能,要有点耐心,图片较多,注意在 ...

  8. SqlServer 可更新订阅升级字段队列数据丢失原因

    原文:SqlServer 可更新订阅升级字段队列数据丢失原因 之前简单描述过数据冲突发生的原因:SQLServer可更新订阅数据冲突的一个原因 ,但具体内部原理是怎么丢失的还不清楚,今天补充说明.可更 ...

  9. 《C标准库》阅读笔记

    <assert.h>的断言函数适合于用来调试,实际产品中难以使用. #define NDEBUG 可禁用断言. #undef NDEBUG 可打开断言. 我自己写的一个例子: #inclu ...

  10. WPF MVVM笔记

    学习了一番WPF MVVM,记录一下,微软的连接(https://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx) 1.mvvm就是model,view ...