인터뷰 질문 30 : 최소 함수를 포함하는 스택 스택
의 데이터 구조를 정의합니다.이 유형에서 스택의 가장 작은 요소를 얻을 수있는 최소 함수를 구현하십시오. 이 스택에서 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);
*/