C语言:剑指 offer 30.包含min函数的栈

完成于2020.11.03

剑指 offer 30.包含min函数的栈

这是来自力扣的一个有关栈与结构体的题目,记录一下自己的想法。
贴个题目链接:点击进入

题目截图

在这里插入图片描述

先上代码
typedef struct 
{
    int top;//stack数组下标
    int min_top;//min_stack数组下标
    int *stack;//栈stack存放所有数据
    int *min_stack;//栈min_stack存放最小的数据
} MinStack;

/** initialize your data structure here. */

//声明一个结构体为obj,并且为里面的元素分配动态内存
MinStack* minStackCreate() 
{
    MinStack*obj=(MinStack*)malloc(sizeof(MinStack));//为obj分配动态内存空间,大小为Minstack,类型为Minstack
    obj->stack=(int*)malloc(sizeof(int)*10000);//为栈stack分配动态内存,大小为10000.类型为int
    obj->min_stack=(int*)malloc(sizeof(int)*10000);//为栈min_stack分配动态内存,大小为10000,类型为int
    obj->top=-1;//初始化stack数组下标为-1
    obj->min_top=-1;//初始化min_stack数组下标为-1
    return obj;//由于函数类型为结构体Minstack,所以应该返回一个结构体obj
}

//推入一个数据
void minStackPush(MinStack* obj, int x) 
{
    obj->stack[++obj->top]=x;//将数据入栈stack
    if(obj->min_top==-1)//如果栈minstack中没有元素就直接入栈
    {
        obj->min_stack[++obj->min_top]=x;
    }
    else
    {
        if(obj->min_stack[obj->min_top]>=x)//否则应该加入数据比栈顶数据小,数据才能入栈
        {
            obj->min_stack[++obj->min_top]=x;
        }
    }
}

//弹出一个数据
void minStackPop(MinStack* obj) 
{
    if(obj->stack[obj->top]==obj->min_stack[obj->min_top])//如果两个栈顶元素相等,则同时移除两个栈顶元素
    {
        obj->top--;
        obj->min_top--;
    }
    else//若两个栈顶元素不相等,则移除stack栈顶元素
    {
        obj->top--;
    }
}

//返回栈stack的栈顶元素
int minStackTop(MinStack* obj) 
{
    return obj->stack[obj->top];
}

//返回栈minstack的栈顶元素
int minStackMin(MinStack* obj) 
{
    return obj->min_stack[obj->min_top];
}

//释放动态内存,free:obj,stack,min_stack
void minStackFree(MinStack* obj) 
{
    free(obj->stack);//先释放obj下的stack和min_stack的动态内存,然后才释放obj,防止出现内存问题
    free(obj->min_stack);
    free(obj);
}

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

/*参考了他人的题解,侵删*/
提交结果

提交结果

碎碎念
  • obj实际上可以想象成一个将军,然后旗下有两个大将。一个大将是stack,负责统领所有的将领(元素)。另一个大将是minstack,现在他要在stack中选出一个精锐队伍(最小元素)。
  • 建议大家先去看一个视频理解一下栈的概念:点击前往
  • 如果需要观看视频理解包含min函数的栈的话,可以看这个视频:点击前往,不过这个是C++的,我还没找到C的。。。。

By Levi.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值