【C++】每日一题 219 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

C++实现:

#include <stack>class MinStack {
private:std::stack<int> mainStack;std::stack<int> minStack;public:MinStack() {}void push(int val) {mainStack.push(val);if (minStack.empty() || val <= getMin()) {minStack.push(val);}}void pop() {if (mainStack.top() == getMin()) {minStack.pop();}mainStack.pop();}int top() {return mainStack.top();}int getMin() {return minStack.top();}
};

在这个实现中,我们使用了两个栈:mainStack 用于存储元素,minStack 用于存储当前栈中的最小元素。

在 push 操作中,我们将元素推入 mainStack 中,并且判断该元素是否比当前最小元素小或等于最小元素,如果是,则将该元素也推入 minStack 中。
在 pop 操作中,我们先判断要删除的元素是否为当前最小元素,如果是,则同时从 mainStack 和 minStack 中删除该元素。
top 操作直接返回 mainStack 的栈顶元素。
getMin 操作直接返回 minStack 的栈顶元素,即当前栈中的最小元素。
这样,通过维护一个辅助栈来保存当前栈中的最小元素,我们可以在常数时间内检索到最小元素,同时支持常见的栈操作。

因为C++有stack数据结构,所以相对C语言逻辑较易实现,这里也给出C语言的两种实现

  1. 链表实现
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int val;int minVal;struct Node* next;
} Node;typedef struct {Node* top;
} MinStack;MinStack* minStackCreate() {MinStack* obj = (MinStack*)malloc(sizeof(MinStack));obj->top = NULL;return obj;
}void minStackPush(MinStack* obj, int val) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->val = val;if (obj->top == NULL || val < obj->top->minVal) {newNode->minVal = val;} else {newNode->minVal = obj->top->minVal;}newNode->next = obj->top;obj->top = newNode;
}void minStackPop(MinStack* obj) {if (obj->top == NULL) {return;}Node* temp = obj->top;obj->top = obj->top->next;free(temp);
}int minStackTop(MinStack* obj) {if (obj->top == NULL) {return -1; // 栈为空时返回特定值}return obj->top->val;
}int minStackGetMin(MinStack* obj) {if (obj->top == NULL) {return -1; // 栈为空时返回特定值}return obj->top->minVal;
}void minStackFree(MinStack* obj) {while (obj->top != NULL) {Node* temp = obj->top;obj->top = obj->top->next;free(temp);}free(obj);
}int main() {MinStack* obj = minStackCreate();minStackPush(obj, -2);minStackPush(obj, 0);minStackPush(obj, -3);printf("Min element: %d\n", minStackGetMin(obj)); // Output: -3minStackPop(obj);printf("Top element: %d\n", minStackTop(obj)); // Output: 0printf("Min element: %d\n", minStackGetMin(obj)); // Output: -2minStackFree(obj);return 0;
}

使用结构体 Node 表示链表节点,每个节点包含元素值 val、当前节点及之前节点中的最小值 minVal,以及指向下一个节点的指针 next。MinStack 结构体中只包含一个指针 top 指向栈顶节点。

通过在节点中记录当前节点及之前节点中的最小值,我们可以实现在常数时间内检索最小元素的功能。

  1. 数组实现
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>typedef struct {int *stack;int *minStack;int top;
} MinStack;MinStack* minStackCreate() {MinStack *obj = (MinStack*)malloc(sizeof(MinStack));obj->stack = (int*)malloc(10000 * sizeof(int)); // 假设栈最大容量为 10000obj->minStack = (int*)malloc(10000 * sizeof(int));obj->top = -1;return obj;
}void minStackPush(MinStack* obj, int val) {obj->top++;obj->stack[obj->top] = val;if(obj->top == 0 || val <= obj->minStack[obj->top - 1]) {obj->minStack[obj->top] = val;} else {obj->minStack[obj->top] = obj->minStack[obj->top - 1];}
}void minStackPop(MinStack* obj) {obj->top--;
}int minStackTop(MinStack* obj) {return obj->stack[obj->top];
}int minStackGetMin(MinStack* obj) {return obj->minStack[obj->top];
}void minStackFree(MinStack* obj) {free(obj->stack);free(obj->minStack);free(obj);
}int main() {MinStack* obj = minStackCreate();minStackPush(obj, -2);minStackPush(obj, 0);minStackPush(obj, -3);printf("Min element: %d\n", minStackGetMin(obj)); // Output: -3minStackPop(obj);printf("Top element: %d\n", minStackTop(obj)); // Output: 0printf("Min element: %d\n", minStackGetMin(obj)); // Output: -2minStackFree(obj);return 0;
}

使用结构体 MinStack 来表示栈,包括一个存储元素的数组 stack 和一个存储当前最小元素的数组 minStack。通过维护一个辅助栈来保存当前栈中的最小元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BigDecimal保留两位小数失败问题

文章目录 背景问题解决如何测试代码 背景 测试时发现在线swagger测试会自动处理BigDecimal小数点后面的数字&#xff0c;就是有零的会都给你去掉&#xff0c;比如9.000与9.500到最后都会被swagger处理成9跟9.5。使用postman测是最准的&#xff0c;测出来的就是9.000跟9.500。 …

数据库基本内容与安装MySQL数据库

目录 一.数据库基本内容 1.数据 &#xff08;1&#xff09;描述事物的符号记录 &#xff08;2&#xff09;包括数字&#xff0c;文字、图形、图像、声音、档案记录等 &#xff08;3&#xff09;以“记录”形式按统一的格式进行存储 2.表 &#xff08;1&#xff09;将不同…

Java SE 22 新增特性

Java SE 22 新增特性 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;Java SE 22 新增特性 CSDN&#xff1a;Java SE 22 新增特性 源码 源仓库: Github&#xff1a;java_new_features 使用未命名的变量和模式 我们经常需要定义一些我们根本不需要的变量…

【Linux】基础 IO(动静态库)-- 详解

一、前言 为什么要使用别人的代码&#xff1f; 主要是为了提高程序开发的效率和程序的健壮性。 当别人把功能都实现了&#xff0c;然后我们再基于别人的代码去做二次开发&#xff0c;那么效率当然就提高了。其次&#xff0c;这里基于的别人当然不是随便找的一个人&#xff0c;…

[Qt学习笔记]Qt鼠标事件mouseMoveEvent实时获取图像的坐标和像素值

目录 1、介绍2、效果展示3、实现过程3.1 图像的加载和显示3.2 设置鼠标跟踪事件激活3.3 实现代码 4、源码展示 1、介绍 上一篇介绍了使用OpenCV的setMouseCallback回调函数实现获取鼠标点击点的图像坐标和像素值&#xff0c;本篇使用鼠标事件mouseMoveEvent函数来实现实时获取…

OPPO 后端二面,凉凉。。。

美众议院通过 TikTok 法案 之前我们讲了 老美要求字节跳动在 165 天内剥离短视频应用 TikTok&#xff0c;当时的最新进度是 TikTok 给 1.7 亿美国用户发弹窗&#xff0c;发动用户群众给国会打电话进行抗议。 但显然这点力度的抗议并不会造成什么实质影响。 昨晚&#xff0c;美国…

精读《useRef 与 createRef 的区别》

1 引言 useRef 是常用的 API&#xff0c;但还有一个 createRef 的 API&#xff0c;你知道他们的区别吗&#xff1f;通过 React.useRef and React.createRef: The Difference 这篇文章&#xff0c;你可以了解到何时该使用它们。 2 概述 其实原文就阐述了这样一个事实&#xf…

【EDSR】《Enhanced Deep Residual Networks for Single Image Super-Resolution》

CVPR workshops-2017 首尔大学 code&#xff1a; https://github.com/limbee/NTIRE2017/tree/masterhttps://github.com/sanghyun-son/EDSR-PyTorch 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Residual blocks4.2 Single…

华为OD机试 - 单向链表中间节点(Java JS Python C C++)

题目描述 给定一个单链表 L&#xff0c;请编写程序输出 L 中间结点保存的数据。 如果有两个中间结点&#xff0c;则输出第二个中间结点保存的数据。例如&#xff1a; 给定 L 为 1→7→5&#xff0c;则输出应该为7&#xff1b; 给定 L 为 1→2→3→4&#xff0c;则输出应该为…

盘点国内IP地址服务的功能及提供商

随着互联网的快速发展和普及&#xff0c;IP地址服务提供商在中国市场扮演着越来越重要的角色。这些代理软件提供商不仅为用户提供稳定的网络连接&#xff0c;还可以帮助用户实现IP地址切换、绕过地理限制等功能。虎观代理接下来将详解国内IP地址服务的主要功能&#xff0c;并对…

王道c语言-chap13 栈实例

王道c语言-chap13 栈实例 #include <iostream>#define END -1 #define MaxSize 50typedef int ElemType; typedef struct {int data[MaxSize];int top; } SqStack;void InitStack(SqStack &s) {s.top-1; }void PrinfSqStack(SqStack s) {for (int i 0; i < s.to…

什么是布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否存在于一个集合中。它的主要优点是占用空间少、查询速度快&#xff0c;并且支持高效的插入和查询操作。 布隆过滤器由一个位数组和多个哈希函数构成。初始时&#xff0c;…

八股文三(Spring、Spring Cloud Alibaba)

Spring篇 什么是Spring Spring是个轻量级的框架&#xff0c;他有两大内核分别是IOC、AOPIOC是什么 * 依赖注入和控制反转&#xff0c;它是一种思想&#xff0c;创建对象不是直接new出来&#xff0c;而是交给IOC容器&#xff0c;由容器去创建进行管理&#xff0c;这就是控制反…

解决antd vue 的table列表过宅内容换行和过长有空白列的问题

主要有两个注意点 1、columns数组中保留一个对象不设置宽度&#xff0c;其余都要设置宽度&#xff1b; 2、HTML中scroll要设置为{x: 足够长的固定宽度}&#xff1b; 具体代码如下&#xff1a; <a-tableref"table"size"middle"rowKey"rowSerial&qu…

字符串函数---(1)

字符函数 文章目录 前言1.strlen 的使用和模拟实现2.strcpy 的使用和模拟实现3. strcat 的使用和模拟实现4. strcmp 的使用和模拟实现 前言 上一篇我们学习了字符函数&#xff0c;下来我们学习常见的字符串函数 1.strlen 的使用和模拟实现 size_t strlen(const char *str) 字…

(70min)字节暑假实习二面(已挂)

还没找到工作的小伙伴加油&#xff01; 字节看面评果然名不虚传。。 面试官&#xff1a; 看你一面基础也回答得不好&#xff0c;没事&#xff0c;那我就不问你八股&#xff0c;多问项目吧。 然后开始鞭打项目。 项目使用mq&#xff0c;从背景的&#xff0c;技术选型&#xff0…

DDOS攻击防御介绍

DDOS&#xff1a;分布式拒绝服务攻击 瞬间收到大量数据 总带宽是有限的 合法用户访问的时候&#xff0c;被非法方法流量占据 无法溯源 流量清洗&#xff1a;AntiDdos 边界&#xff0c;旁挂的 备用域名&#xff0c;ip更换 机房会提供解决方案 解决不了问题&#xff0c;就干…

【真实体会】花几百块买ChatGPT4.0账号一年值得吗?

GPT4.0使用体验及价值 性能提升: GPT4比GPT3.5在内容质量和数量上有显著提高&#xff0c;使得知乎等平台的收益增加。 功能丰富: GPT4支持文本、图片、文件问答&#xff0c;而GPT3.5仅支持文本。GPT4内置多种专业工具&#xff08;GPTS&#xff09;&#xff0c;如设计师LOGO的A…

关于我的经历

技能 1 Java基础扎实&#xff0c;具备并发编程经验&#xff0c;熟悉JMM、线程通信线程安全、锁、原子类、阻塞队列、并发容器、线程池原理。清楚并发内容的实现原理。阅读过部分JDK源码。 深入了解JVM虚拟机&#xff1a;内存模型、GC、垃圾回收算法、以及垃圾回收器&#xff0…

Android Studio实现内容丰富的安卓视频管理平台

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号081 1. 开发环境 android stuido 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.本地视频 3.视频播放 4.收藏功能 5.网路视频 6.个人中心 7.我的收藏 8.浏览历史 3.系…