完成于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.