力扣155(最小栈)

最小栈


链接: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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值