[leetcode]Min Stack (获取栈的最小元素C语言实现)

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) {//不用管这个函数

}

你可能感兴趣的:(leetcode)