C语言刷题 LeetCode 30天挑战 (十)Stack 栈 (MinStack)

news/2025/2/12 0:13:19/

这个题目要求你设计一个特殊的栈(MinStack),不仅要具备普通栈的基本功能(pushpoptop),还要能够在常数时间内(O(1) 时间复杂度)获取栈中的最小元素(getMin)。

基本栈操作如下:

  • push(x):将元素 x 压入栈顶。
  • pop():移除栈顶元素。
  • top():返回栈顶元素,但不移除它。
  • getMin():在常数时间内返回当前栈中最小的元素。

//Design a stack that supports push, pop, top, 
//and retrieving the minimum element in constant time
//push(x)-- Push element x onto stack.
//pop() --Removes the element on top of the stack.
//top() -- Get the top element.
//getMin()--Retrieve the minimum element in the stack.

//Minstack minstack = new Minstack();
//minstack.push(-2);
//minstack.push(0);
//minstack.push(-3);
//minstack.getMin();--> Returns -3.
//minstack.pop();
//minstack.top();--> Returns 0.
//minstack.getMin();--> Returns -2.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>// 定义栈结构
typedef struct {int *stack;       // 存储所有元素的栈int *minStack;    // 辅助存储最小元素的栈int top;          // 主栈的栈顶指针int minTop;       // 最小栈的栈顶指针int capacity;     // 栈的容量
} Minstack;// 创建 Minstack 并初始化
Minstack* minStackCreate() {Minstack* obj = (Minstack*)malloc(sizeof(Minstack));obj->capacity = 100;  // 假设初始容量为100obj->stack = (int*)malloc(sizeof(int) * obj->capacity);obj->minStack = (int*)malloc(sizeof(int) * obj->capacity);obj->top = -1;obj->minTop = -1;return obj;
}// push 操作
void minstackPush(Minstack* obj, int x) {// 主栈操作obj->stack[++(obj->top)] = x;// 更新最小栈if (obj->minTop == -1 || x <= obj->minStack[obj->minTop]) {obj->minStack[++(obj->minTop)] = x;}
}// pop 操作
void minstackPop(Minstack* obj) {if (obj->top == -1) return;  // 空栈int popped = obj->stack[obj->top--];  // 弹出主栈栈顶元素// 如果弹出的元素是当前最小值,也从 minStack 中弹出if (popped == obj->minStack[obj->minTop]) {obj->minTop--;}
}// 获取栈顶元素
int minstackTop(Minstack* obj) {if (obj->top == -1) return -1;  // 空栈return obj->stack[obj->top];
}// 获取栈中的最小元素
int minstackGetMin(Minstack* obj) {if (obj->minTop == -1) return -1;  // 空栈return obj->minStack[obj->minTop];
}// 释放栈内存
void minstackFree(Minstack* obj) {free(obj->stack);free(obj->minStack);free(obj);
}// 打印主栈和最小栈的内容
void printStack(Minstack* obj) {printf("Stack: ");if (obj->top == -1) {printf("Empty\n");} else {for (int i = 0; i <= obj->top; i++) {printf("%d ", obj->stack[i]);}printf("\n");}printf("MinStack: ");if (obj->minTop == -1) {printf("Empty\n");} else {for (int i = 0; i <= obj->minTop; i++) {printf("%d ", obj->minStack[i]);}printf("\n");}
}int main() {Minstack* minstack = minStackCreate();minstackPush(minstack, -2);minstackPush(minstack, 9);minstackPush(minstack, -3);minstackPush(minstack, 1);minstackPush(minstack, 2);minstackPush(minstack, 3);printStack(minstack);  // 打印主栈和最小栈printf("getMin: %d\n", minstackGetMin(minstack));  // 返回 -3minstackPop(minstack);printStack(minstack);  // 打印主栈和最小栈printf("top: %d\n", minstackTop(minstack));        // 返回 0printf("getMin: %d\n", minstackGetMin(minstack));  // 返回 -2printStack(minstack);  // 打印主栈和最小栈minstackFree(minstack);  // 释放内存return 0;
}


http://www.ppmy.cn/news/1538899.html

相关文章

算法题总结(十五)——贪心算法(下)

1005、K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可…

2025考研今天开始预报名!攻略请查收

2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程&#xff1f;需要准备哪些信息&#xff1f; 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段&#xff1a; 网上预报名时间为10月9日至10月12日&#xff08;每日9&#xff1…

系统分析师要换教材了,新增大量「案例实践」,下半年可能这样考……

最近&#xff0c;在“中国权威的出版物数据服务平台”搜索新版系统分析师教程时发现&#xff1a; 原定的新教程出版日期已经从8月更新至10月&#xff0c;而且教程目录已经更新&#xff0c;内容变化也可以看出来了。 那么&#xff0c;新教程出版会对我们下半年的系分考试有哪些…

初学Qt之环境安装与 hello word

环境&#xff1a; Qt Creator 4.11.0 (Community) Qt 5.14.0 目录 1.Qt环境配置 1.1 下载Qt 5.14.0 1.2 注册Qt账号 1.3 安装Qt 1.4 配置环境变量 2.创建项目 2.1 创建一个项目 2.2 初始代码解析 2.3 可视化GUI ​编辑 2.4 hello word 2.4.1 可视化hello word …

华为OD机试 - 小明找位置 - 二分查找(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

美畅物联丨剖析 GB/T 28181 与 GB 35114:视频汇聚领域的关键协议

我们在使用畅联云平台进行视频汇聚时&#xff0c;经常会用的GB/T 28181协议&#xff0c;前面我们写了关于GB/T 28181的相关介绍&#xff0c;​ 详见《畅联云平台&#xff5c;关于GB28181你了解多少&#xff1f;》。 ​最近也有朋友向我们咨询GB 35114协议与GB/T 28181有什么不同…

KubeSphere部署mysql

演示示例使用的是3.4.1&#xff0c;各版本有名字差异 功能是一样的 由于mysql需要做数据持久化所以需要挂载数据 1.创建mysql基础配置 项目中-配置-配置字典 mysql-conf添加键值对 [client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4 [mysqld] …

STM32传感器模块编程实践(六) 1.8寸液晶屏TFT LCD彩屏简介及驱动源码

文章目录 一.概要二.TFT彩屏主要参数三.TFT彩屏参考原理图四.TFT彩屏模块接线说明五.模块SPI通讯协议介绍六.TFT彩屏模块显示1.显示英文字符串2.显示数字3.显示中文 七.TFT彩屏实现图片显示八.STM32单片机1.8寸 TFT LCD显示实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九…