最小栈
链接:https://leetcode.cn/problems/min-stack
两种简洁写法(本质都是两个栈协作):
- 动态数组
- 静态数组
写法一(动态数组):
- 数据结构定义
typedef struct {
int* data; // 数据栈:存正常元素
int* minData; // 辅助栈:存「当前栈内最小元素」
int top; // 栈顶指针(同时控制 data 和 minData)
} MinStack;
- 初始化栈结构
// 同时为数据栈、辅助栈分配空间
MinStack* minStackCreate() {
MinStack* obj = (MinStack*)calloc(1, sizeof(MinStack));
obj->data = (int*)malloc(sizeof(int) * 30000); // 题目给的 Maxlen
obj->minData = (int*)malloc(sizeof(int) * 30000); // 辅助栈
obj->top = 0;
return obj;
}
- push:数据栈和辅助栈「同步压栈」
void minStackPush(MinStack* obj, int val) {
// 数据栈正常压入
obj->data[obj->top] = val;
// 辅助栈:若栈空,直接压入;否则比较「当前辅助栈顶」和「新值」,取较小者压入
if (obj->top == 0) {
obj->minData[obj->top] = val;
} else {
obj->minData[obj->top] = MIN(obj->minData[obj->top - 1], val); // 此处是自定义函数MIN
}
obj->top++;
}
- pop:数据栈和辅助栈「同步弹出」(仅需移动栈顶指针,物理内存可不清理)
void minStackPop(MinStack* obj) {
if(obj->top > 0)
obj->top–;
}
- top:直接取数据栈的栈顶(注意是 top-1,因为 push 后 top 已自增)
int minStackTop(MinStack* obj) {
return obj->data[obj->top - 1];
}
- getMin:直接取辅助栈的栈顶(top-1,逻辑同 top)
int minStackGetMin(MinStack* obj) {
return obj->minData[obj->top - 1];
}
- 释放内存:数据栈、辅助栈、栈对象本身都要释放
void minStackFree(MinStack* obj) {
free(obj->data);
free(obj->minData);
free(obj);
}
Code
#define Maxlen 30000
#define MIN(a,b) ((a) < (b) ? (a) : (b))
typedef struct {
int* data;
int* minData;
int top;
} MinStack;
MinStack* minStackCreate() {
MinStack* obj = calloc(1, sizeof(MinStack));
obj->data = malloc(sizeof(int) * Maxlen);
obj->minData = malloc(sizeof(int) * Maxlen);
obj->top = 0;
return obj;
}
void minStackPush(MinStack* obj, int val) {
obj->data[obj->top] = val;
if(obj->top == 0) {
obj->minData[obj->top] = val;
} else {
obj->minData[obj->top] = MIN(obj->minData[obj->top - 1], val);
}
obj->top++;
}
void minStackPop(MinStack* obj) {
if(obj->top > 0)
obj->top--;
}
int minStackTop(MinStack* obj) {
return obj->data[obj->top - 1];
}
int minStackGetMin(MinStack* obj) {
return obj->minData[obj->top - 1];
}
void minStackFree(MinStack* obj) {
free(obj->data);
free(obj->minData);
free(obj);
}
这里直接贴另一种写法 (来自 灵茶山艾府 ,这是真大佬) :
Code
#define MIN(a, b) ((b) < (a) ? (b) : (a))
// 这里的 0 写成任意数都可以,反正用不到
int st[30000][2] = {{0, INT_MAX}}; // 栈底哨兵
typedef struct {
int top; // 当前栈顶下标
} MinStack;
MinStack* minStackCreate() {
MinStack* obj = malloc(sizeof(MinStack));
obj->top = 0;
return obj;
}
void minStackPush(MinStack* obj, int val) {
obj->top++;
st[obj->top][0] = val;
st[obj->top][1] = MIN(st[obj->top - 1][1], val);
}
void minStackPop(MinStack* obj) {
obj->top--;
}
int minStackTop(MinStack* obj) {
return st[obj->top][0];
}
int minStackGetMin(MinStack* obj) {
return st[obj->top][1];
}
void minStackFree(MinStack* obj) {
free(obj);
}