最小栈:请你设计一个 最小栈 。它提供 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MIN(a, b) ((b) < (a) ? (b) : (a))
// 全局数组,最多支持30000个元素
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);
}
思路:通过一个二维数组存储元素,其中每个栈元素记录两个值——实际值和从栈底到当前位置的最小值。push操作时,比较新值和前一个元素的最小值,更新当前最小值;pop操作只需移动指针;获取最小值时直接返回栈顶存储的最小值。这样,所有操作都在O(1)时间内完成,空间换时间实现了高效的最小值查询。