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

完成于2020.11.03

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

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

题目截图

C语言:剑指 offer 30.包含min函数的栈_第1张图片

先上代码

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);
*/

/*参考了他人的题解,侵删*/

提交结果

C语言:剑指 offer 30.包含min函数的栈_第2张图片

碎碎念

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

By Levi.

你可能感兴趣的:(C/C++,c语言,栈,数据结构)