栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

包含min函数的栈(最小栈)C语言版

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

包含min函数的栈(最小栈)C语言版

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/

示例:

代码(前面都是实现栈的接口,实际代码很短):

MinStack* minStackCreate() {
    MinStack* obj = (MinStack*)malloc(sizeof(stack)*2);
    StackInit(&obj->s);
    StackInit(&obj->min);
    return obj;
}

void minStackPush(MinStack* obj, int x) {
    if(stackEmpty(&obj->s))
    {
        stackPush(&obj->s,x);
        stackPush(&obj->min,x);
    }
    else
    {
        if(x<=stackTop(&obj->min))//如果插入的值比最小值要小就两个栈都要插入
        {
            stackPush(&obj->s,x);
            stackPush(&obj->min,x);
        }
        else//否则只插入s,min里面继续插入最小值
        {
            stackPush(&obj->s,x);
            stackPush(&obj->min,stackTop(&obj->min));
        }
    }
}

void minStackPop(MinStack* obj) {
    stackPop(&obj->s);
    stackPop(&obj->min);
}

int minStackTop(MinStack* obj) {
    return stackTop(&obj->s);
}

int minStackMin(MinStack* obj) {
    return stackTop(&obj->min);
}

void minStackFree(MinStack* obj) {
    stackDestroy(&obj->s);
    stackDestroy(&obj->min);
    free(obj);
    obj = NULL;
}

思路:用两个栈实现,其中一个栈正常插入数据,另外一个栈专门储存插入中的最小那个值。

插入思路

下面是代码角度的思路:

逻辑上讲:每次插入一个新元素,都要与前面一个插入的元素相比较的原因是要保证找出最小的那个元素。

  1. 如果新元素是最小的,就同时插入最小栈和普通栈。
  2. 如果不是最小的,插入普通栈,然后在min栈里面插入一个之前最小的元素。(原因:删除的时候有可能把最小的元素删除掉,你要有足够的元素去更新换代,如果不插入可能会导致最小栈变成空了。)

删除思路

返回最小值思路

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311894.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号