LeetCode_155. 最小栈_C

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

两个方法:
方法一:使用辅助栈,存入最小值,当getmin时,去辅助栈;当pop时,如果两个栈顶元素相等,两个栈都出栈
方法二:每次入栈都记录dat和min;不需要辅助栈

https://leetcode.cn/problems/min-stack/

solution 2

/**
    因为要能在常数时间内检索到最小元素的栈,如果直接简单用栈,getmin时需要遍历一遍,这可不行
    方法一:使用辅助栈,存入最小值,当getmin时,去辅助栈;当pop时,如果两个栈顶元素相等,两个栈都出栈
    方法二:每次入栈都记录dat和min;不需要辅助栈

*/

//方法二
struct stack{//单栈同时存储 最小值 + 数据值 一起成套的入栈中
    int dat;
    int min;
};
typedef struct {//声明结构体类型
//typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。
//这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
//typedef struct是定义一个标识符及关键字的别名,无具体含义。它是语言编译过程的一部分,为了使用结构体方便。
    
    //正常 stack
    struct stack stackDat[10000];
    int stackTop;
} MinStack;

MinStack* minStackCreate() {//初始化堆栈元素 
    MinStack* newStack = (MinStack*)malloc(sizeof(MinStack));//动态规划申请一个栈,叫newStack
    newStack->stackTop = 0;
    return newStack;
}
// 函数传入MinStack* obj的是头指针,实际的值是指向Next的
void minStackPush(MinStack* obj, int val) {//push 将元素val推入堆栈
    //先压入数据栈
    obj->stackDat[obj->stackTop].dat=val;

    //判断当前最小值,压入最小值
    if(!obj->stackTop||val <= obj -> stackDat[obj->stackTop-1].min){
        obj->stackDat[obj->stackTop].min = val;
    }else{
        obj->stackDat[obj->stackTop].min = obj->stackDat[obj->stackTop-1].min;
    }
    obj->stackTop++;
}

void minStackPop(MinStack* obj) {//pop删除堆栈栈顶元素
    obj->stackTop--;
}

int minStackTop(MinStack* obj) {//top获取堆栈顶部元素
    return obj->stackDat[obj->stackTop-1].dat;
}

int minStackGetMin(MinStack* obj) {//getmin获取堆栈中的最小元素
    return obj->stackDat[obj->stackTop-1].min;
}

void minStackFree(MinStack* obj) {//free释放
    free(obj);
}

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, val);
 
 * minStackPop(obj);
 
 * int param_3 = minStackTop(obj);
 
 * int param_4 = minStackGetMin(obj);
 
 * minStackFree(obj);
*/

solution 1

//方法一
//单调栈 单调递减
typedef struct{
    //正常 stack
    int stack[10000];
    int stackTop;

    //辅助 stack
    int minStack[10000];
    int minStackTop;
}MinStack;

MinStack* minStackCreate(){
    MinStack* newStack = (MinStack*)malloc(sizeof(MinStack));
    newStack->stackTop = 0;
    newStack->minStackTop = 0;
    return newStack;
}

void minStackPush(MinStack* obj,int val){
    //先压入数据栈
    obj->stack[obj->stackTop++]=val;

    //当前值 小于等于 辅助栈顶值
    if(!obj->minStackTop||val <= obj->minStack[obj->minStackTop-1]){
        obj->minStack[obj->minStackTop++]=val;
        //先操作再自增
    }

}
void minStackPop(MinStack* obj){
    if(obj->minStack[obj->minStackTop-1]==obj->stack[obj->stackTop-1]){
        obj->minStackTop--;
    }
    obj->stackTop--;
}

int minStackTop(MinStack* obj){
    return obj->stack[obj->stackTop-1];
}

int minStackGetMin(MinStack* obj){
    return obj->minStack[obj->minStackTop-1];
}

void minStackFree(MinStack* obj){
    free(obj);
}

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, val);
 
 * minStackPop(obj);
 
 * int param_3 = minStackTop(obj);
 
 * int param_4 = minStackGetMin(obj);
 
 * minStackFree(obj);
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值