面试题30:包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。
创新点:MinStack结构体里的是指针不是一个栈,出栈只需改指针指向,无需弹出栈顶元素
力扣链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
typedef struct
{
// 结构体里的是指针不是一个栈
int* data_stack;
int* min_stack;
int data_index;
int min_index;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate()
{
MinStack* p = (MinStack*)malloc(sizeof(MinStack));
p -> data_stack = (int*)malloc(sizeof(int) * 20000);
p -> min_stack = (int*)malloc(sizeof(int) * 20000);
p -> data_index = 0;
p -> min_index = 0;
return p;
}
int minStackTop(MinStack*);
void minStackPush(MinStack* obj, int x)
{
(obj -> data_stack)[obj -> data_index++] = x;
if(obj -> min_index == 0 || x < (obj -> min_stack)[obj -> min_index - 1])
(obj -> min_stack)[obj -> min_index++] = x;
else
(obj -> min_stack)[obj -> min_index++] = (obj -> min_stack)[obj -> min_index - 1];
}
// 最值得学习的就是出栈只需改指针指向,无需删除值
void minStackPop(MinStack* obj)
{
if(obj -> data_index > 0)
{
obj -> data_index--;
obj -> min_index--;
}
}
int minStackTop(MinStack* obj)
{
return (obj -> data_stack)[obj -> data_index - 1];
}
int minStackMin(MinStack* obj)
{
return (obj -> min_stack)[obj -> min_index - 1];
}
void minStackFree(MinStack* obj)
{
free(obj -> data_stack);
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);
*/