广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言之包含min函数的栈实例详解
  • 236
分享到

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

2024-04-02 19:04:59 236人浏览 薄情痞子
摘要

目录一、题目描述二、思路分析三、整体代码总结一、题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时

一、题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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;



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);
}


运行,验证通过

在这里插入图片描述

总结

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

--结束END--

本文标题: C语言之包含min函数的栈实例详解

本文链接: https://www.lsjlt.com/news/139673.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言之包含min函数的栈实例详解
    目录一、题目描述二、思路分析三、整体代码总结一、题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时...
    99+
    2022-11-13
  • 前端算法之TypeScript包含min函数的栈实例详解
    目录前言思路梳理实现代码示例代码前言 基于数据结构: “栈”,实现一个min函数,调用此函数即可获取栈中的最小元素。在该栈中,调用min、push、pop的时...
    99+
    2022-11-13
  • java算法题解LeetCode30包含min函数的栈实例
    目录题目解题思路题目 剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 p...
    99+
    2023-01-05
    java算法包含min函数的栈 java LeetCode
  • C语言之system函数案例详解
    来看看在windows操作系统下system () 函数详解(主要是在C语言中的应用) 注意:在windows下的system函数中命令可以不区别大小写! 函数名: system...
    99+
    2022-11-12
  • 详细理解函C语言的函数栈帧
    目录一、函数栈帧的创建1.寄存器2.函数栈帧3.函数中调用函数二、函数栈帧的销毁总结一、函数栈帧的创建 1.寄存器 一般来说,计算机中的寄存器有六种 分别是:eax, ebx, e...
    99+
    2022-11-12
  • C语言实现栈的示例详解
    目录前言一. 什么是栈二. 使用什么来实现栈三. 栈的实现3.1 头文件3.2 函数实现3.3 完整代码四. 栈的用处前言 前一段时间,我们试着用C语言实现了数据结构中的顺序表,单链...
    99+
    2022-11-13
  • C语言 栈与数组的实现详解
    目录栈的实现栈的定义数组实现静态栈动态栈链栈栈的实现 首先我们思考一个问题,什么是栈? 栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的...
    99+
    2022-11-13
  • C语言函数栈帧的创建与销毁详解
    目录前言一、函数栈帧是什么?1.寄存器2.ebp与esp二、函数栈帧的创建1.代码块2.调用堆栈3.esp与ebp如何维护栈帧总结 前言 大家在学习的时候一定有以下困惑: ...
    99+
    2022-11-13
  • C语言函数栈帧的创建和销毁详解
    目录写在前面Add函数的调用函数传参Add函数栈帧的创建Add函数栈帧的销毁main函数栈帧的销毁总结写在前面 我们知道,每一次函数调用都需要在栈区上为其开辟一块空间,这块空间就叫做...
    99+
    2022-11-13
  • 通过实例详解C语言函数返回值
    目录前言C语言返回值c语言函数调用后必须带回返回值总结前言 函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过 return 语句返回。 return 语句...
    99+
    2022-11-13
  • C语言详尽图解函数栈帧的创建和销毁实现
    目录常见寄存器基本的汇编语言知识具体实现关于栈帧创建与销毁的问答题注:本文章所使用的编译器是VS2010,由于不同编译器的函数栈帧与销毁略有差异,所以具体细节请读者自行实践! 常见寄...
    99+
    2022-11-13
  • c语言函数栈帧的创建和销毁过程详解
    目录1 相关知识介绍 1.1 寄存器1.2 函数栈帧概述2 栈帧创建与销毁过程1 相关知识介绍  1.1 寄存器 一般计算机内通用寄存器包括eax,ebx,ec...
    99+
    2022-11-12
  • C语言超详细讲解函数栈帧的创建和销毁
    目录1、本节目标2、相关寄存器3、相关汇编指令4、什么是函数栈帧5、什么是调用堆栈6、函数栈帧的创建和销毁(1)、main函数栈帧的创建与初始化(2)、main函数的核心代码(3)、...
    99+
    2022-11-13
  • C语言中回调函数的含义与使用场景详解
    目录举例动态改变回调函数的实现的方法:1)编译时直接赋值2)运行时实现动态注册3)作为函数参数传递到指定的函数内总结举例 在下述程序中函数 test2_cal() 中调用&...
    99+
    2022-11-13
  • C语言的可变参数函数实现详解
    目录1、简介2、简单的使用方式总结1、简介 今天看到一个有趣的东西C语言的可变参数函数 众所周知,C语言的函数不能重载,那么你printf和scanf是怎么可以输入多个参数的 例如查...
    99+
    2022-11-12
  • C语言中回调函数的含义与使用场景详解(2)
    目录详解C语言中回调函数的含义与使用场景(2)使用场景一(重定义):使用场景二(扩展函数功能):使用场景三(分层):总结详解C语言中回调函数的含义与使用场景(2) 引言:在上一篇文章...
    99+
    2022-11-13
  • C语言三个函数的模拟实现详解
    目录一、strcpy二、模拟实现strcat三、strcmp总结:一、strcpy //模拟实现strcpy #include<stdio.h> #include<...
    99+
    2022-11-13
  • C语言详解strcmp函数的分析及实现
    目录1.函数介绍1.1.函数接口1.2.函数分析1.3.函数的简单使用1.4.函数使用结果分析2.库函数strcmp源代码2.1.库函数源代码2.2.库函数分析3.模拟实现 strc...
    99+
    2022-11-13
  • C语言详细讲解strcpystrcatstrcmp函数的模拟实现
    目录一、模拟实现strcpy函数二、模拟实现strcat函数三、模拟实现strcmp函数四、小结一、模拟实现strcpy函数 strcpy函数是字符串拷贝函数,就是将源字符串拷贝到目...
    99+
    2022-11-13
  • C语言常用库函数的使用及模拟实现详解例举
    目录1.strlen1.计数法2.递归法3.指针减指针2.strcpy3.strcmp4.strcat5.strstr6.strtok7.字符分类函数8.memcpy&mem...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作