C语言之包含min函数的栈实例详解

 更新时间:2022年02月18日 11:08:40   作者:爱你哦小猪猪  
这篇文章主要为大家详细介绍了C语言之包含min函数的栈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、题目描述

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

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();      --> 返回-3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();      --> 返回-2.

提示:各函数的调用总次数不超过 20000 次

二、思路分析

:思路分析中的一些内容和图片参考自力扣各位前辈的题解,感谢他们的无私奉献

分析

普通栈的push()pop()函数的复杂度为O(1),而获取栈最小值min()函数需要遍历整个栈,复杂度为O(N)

本题需要将min()函数复杂度降为O(1),则可通过建立辅助栈实现。栈1用于存储所有元素,入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数保持正常。栈2栈顶始终放着栈1最小元素,这样就可以实现min()函数的O(1)复杂度。

函数设计

push(x) 函数

①栈1正常进行入栈即可

②栈2则需要注意,栈2的栈顶一定是栈1的最小元素。每次入栈时,判断栈2是否为空。若为,则将x压入栈2。若栈2不为空,判断x与栈2的栈顶元素的大小关系,若x栈2的栈顶元素,则将x压入栈2。

pop()函数

①栈1正常进行出栈即可

②栈2则需要注意,栈1出栈1个元素后,栈2的栈顶元素仍然要为栈1的最小元素。每次出栈时,将出栈元素标记为y,若y等于栈2的栈顶元素,则栈2也执行出栈

top() 函数

直接返回栈1的栈顶元素即可

min() 函数

直接返回栈2的栈顶元素即可

示例

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、整体代码

整体代码如下

#define N 20000

//创建两个栈,栈1用于正常的入栈出栈操作,栈2用于将栈1的最小元素防在栈顶
typedef struct {
    int *Stack1;
    int *Stack2;
    int top1;
    int top2;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack* MS=(MinStack*)malloc(sizeof(MinStack));
    MS->Stack1 = (int*)malloc(sizeof(int)*N);
    MS->Stack2 = (int*)malloc(sizeof(int)*N);
    MS->top1 = -1;
    MS->top2 = -1;
    return MS;
}

void minStackPush(MinStack* obj, int x) {
    obj->Stack1[++obj->top1] = x; //栈1正常入栈
    if(obj->top2 == -1){   //如果栈2是空的
        obj->Stack2[++obj->top2] = x; //将x也压入栈2
    }
    else{
        //如果栈2不空,同时x<=栈2的栈顶元素
        if(x <= obj->Stack2[obj->top2]){
            //将x压入栈2的栈顶
            obj->Stack2[++obj->top2] = x;
        }
    }

}

void minStackPop(MinStack* obj) {
    //保存栈1的栈顶元素,同时top1-1
    int a = obj->Stack1[obj->top1];
    obj->top1--;
    //如果栈1的栈顶元素等于栈2的栈顶元素,则将栈2的栈顶元素弹出,top2-1
    if(a==obj->Stack2[obj->top2]){
        obj->top2--;
    }
}

//正常返回栈1的栈顶元素即可
int minStackTop(MinStack* obj) {
    return obj->Stack1[obj->top1];
}

//正常返回栈2的栈顶元素即可
int minStackMin(MinStack* obj) {
    return obj->Stack2[obj->top2];
}

void minStackFree(MinStack* obj) {
    free(obj->Stack1);
    free(obj->Stack2);
    free(obj);
}

/**
 * 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 = minStackMin(obj);
 
 * minStackFree(obj);
*/

运行,验证通过

在这里插入图片描述

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!   

相关文章

  • c++通过引用实现三个数字求最大值

    c++通过引用实现三个数字求最大值

    下面我们将通过这个例子来说明引用的作为函数参数的使用方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C/C++左旋字符串实现代码举例

    C/C++左旋字符串实现代码举例

    在C/C++语言中没有专门的字符串变量,通常用字符数组来存放字符串,下面这篇文章主要给大家介绍了关于C/C++左旋字符串实现的相关资料,需要的朋友可以参考下
    2023-12-12
  • C++中的Primer拷贝控制和资源管理详解

    C++中的Primer拷贝控制和资源管理详解

    这篇文章主要介绍了C++中的Primer拷贝控制和资源管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C语言实现字符串转浮点函数的示例

    C语言实现字符串转浮点函数的示例

    字符串不仅可以转换为整数,也可以转换为浮点数,本文主要介绍了C语言实现字符串转浮点函数的示例,具有一定的参考价值,感兴趣的可以了解一下
    2022-02-02
  • 简要对比C语言中三个用于退出进程的函数

    简要对比C语言中三个用于退出进程的函数

    这篇文章主要介绍了C语言中三个用于退出进程的函数的对比,分别为_exit()函数和on_exit()函数以及atexit()函数,需要的朋友可以参考下
    2015-08-08
  • 总结c++性能优化策略

    总结c++性能优化策略

    在本篇文章中小编给大家总结了关于C++的性能优化策略的相关知识点,对此有兴趣的朋友可以参考学习下。
    2018-03-03
  • 使用c++实现OpenCV绘制旋转矩形图形

    使用c++实现OpenCV绘制旋转矩形图形

    这篇文章主要给大家介绍了使用c++实现OpenCV绘制图形旋转矩形的方法案例,通过图文及代码形式进行了详细的描述,有需要的朋友可以参考下,希望可以有所帮助
    2021-08-08
  • 解析C++ 浮点数的格式化输出

    解析C++ 浮点数的格式化输出

    本篇文章是对C++中浮点数的格式化输出进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • vscode C++远程调试运行(学习C++用)

    vscode C++远程调试运行(学习C++用)

    这篇文章主要介绍了vscode C++远程调试运行(学习C++用),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C++计数排序详解

    C++计数排序详解

    计数排序的思想我们之前接触过的例如:插入排序,归并排序,快速排序,堆排序等都是基于集合元素之间的比较这一基本的思想,它们执行的时间复杂度最优是趋于O(nlgn),而计数排序的运行机制不是基于集合元素之间的大小比较
    2016-04-04

最新评论