力扣-最小栈

23 阅读1分钟

最小栈:请你设计一个 最小栈 。它提供 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)时间内完成,空间换时间实现了高效的最小值查询。