Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x) – Push element x onto stack.
pop() – Removes the element on top of the stack.
top() – Get the top element.
getMin() – Retrieve the minimum element in the stack.
题目意思:设计一个栈,让它能实现push,pop,top,并同时能获取栈元素的最小值。
push(x)–压栈
pop()–出栈
top()–获取栈顶元素
getMin()–获取栈的最小元素
解题思路:要求压栈、出栈、寻找栈中最小值的时间复杂度都是O(1),所以按照网友博客给的资料需要申请两个栈,一个用于正常的存储数据(data数组),另一个用于存储最小值(min数组),并设置相应两个栈的栈顶指针,对于压栈和出栈的时间复杂度当然是O(1),但难点在getMin获取栈的最小值,若使用一般的求数组的最小值算法,其时间复杂度为O(n),所以不符合题意对于min数组用于存储data栈的最小值,当push数据进data数组时同时和min数组的栈顶元素进行比较,若大于min的栈顶元素则不压入min数组内,否则同时压入min数组中,这样getMin()就直接从min数组中的栈顶读取,时间复杂度为O(1)。
难点:不容易想到用两个栈来存储数据,一个用于正常的存储栈数据,,另一个用于存储前一个栈的最小值。
实现C代码:
/**
* 解题思路:要求压栈、出栈、寻找栈中最小值的时间复杂度都是O(1),所以按照网友博客给的资料
* 需要申请两个栈,一个用于正常的存储数据(data数组),另一个用于存储最小值(min数组),
* 并设置相应两个栈的栈顶指针,对于压栈和出栈的时间复杂度当然是O(1),但难点在getMin获取栈的最小值,
* 若使用一般的求数组的最小值算法,其时间复杂度为O(n),所以不符合题意
* 对于min数组用于存储data栈的最小值,当push数据进data数组时同时和min数组的栈顶元素进行比较,若
* 大于min的栈顶元素则不压入min数组内,否则同时压入min数组中
* 这样getMin()就直接从min数组中的栈顶读取,时间复杂度为O(1)。
*
*/
typedef struct {
int data[20000];//初始化时给定栈大小为20000
int min[20000];//同时让min的大小也为20000,防止压入data的全是一样的数据
int top;//data的栈顶指针
int mintop;//min的栈顶指针
} MinStack;
void minStackCreate(MinStack *stack, int maxSize) {//栈的大小初始化已经在创建栈的时候给定了,本人设置的是20000大小,不用管maxSize
stack->top = -1;
stack->mintop = -1;
memset(stack->data, 0, 20000);
memset(stack->min, 0 ,20000);
}
void minStackPush(MinStack *stack, int element) {//压入data时同时把最小值也压入min数组
if(stack->top < 19999){
stack->top++;
stack->data[stack->top] = element;
if(stack->mintop == -1 || element <= stack->min[stack->mintop]){
stack->mintop++;
stack->min[stack->mintop] = element;
}
}else{
return;
}
}
void minStackPop(MinStack *stack) {//删除data栈顶元素时,同时比较data栈顶元素值是否等于min数组的栈顶元素值,若相等则min数组出栈
int temp, temp1;
if(stack->top == -1){
return;
}
temp = stack->data[stack->top];
stack->top--;
if(temp == stack->min[stack->mintop]){
temp1 = stack->min[stack->mintop];
stack->mintop--;
}
}
int minStackTop(MinStack *stack) {
return stack->data[stack->top];
}
int minStackGetMin(MinStack *stack) {//这里直接获取min数组的栈顶元素,也就是data数组的最小值
return stack->min[stack->mintop];
}
void minStackDestroy(MinStack *stack) {//不用管这个函数
}