0
点赞
收藏
分享

微信扫一扫

【剑指offer】30.包含min函数的栈

RJ_Hwang 2022-04-13 阅读 21
算法

C语言版本

#define MAX_STACK_SIZE 20000

typedef struct
{
    int *main_stack;  // 主栈,用于存放正常入栈的元素
    int *min_value_stack;  // 最小值栈,用于存放当前主栈的最小值
    int top_main_stack;  // 主栈栈顶
    int top_min_value_stack;  // 最小值栈栈顶
    int min_value;  // 最小值
} MinStack;

MinStack* minStackCreate()
{
    MinStack *obj;
    obj = (MinStack*)malloc(sizeof(MinStack));
    if (obj == NULL)
    {
        return NULL;
    }

    obj->main_stack = (int*)malloc(MAX_STACK_SIZE * sizeof(int));
    if (obj->main_stack == NULL)
    {
        free(obj);
        return NULL;
    }

    obj->min_value_stack = (int*)malloc(MAX_STACK_SIZE * sizeof(int));
    if (obj->min_value_stack == NULL)
    {
        free(obj);
        return NULL;
    }

    obj->top_main_stack = -1;
    obj->top_min_value_stack = -1;
    obj->min_value = 0;

    return obj;
}

void minStackPush(MinStack* obj, int x)
{
    if (obj->top_main_stack < MAX_STACK_SIZE)
    {
        // // 主栈压入元素
        // obj->main_stack[++obj->top_main_stack] = x;

        // // 最小值栈压入元素
        // if (obj->top_main_stack == -1)
        // {
        //     obj->min_value = x;  // 注意这个边界条件
        // }
        // else
        // {
        //     if (x < obj->min_value)
        //     {
        //         obj->min_value = x;
        //     }
        // }
        // obj->min_value_stack[++obj->top_min_value_stack] = obj->min_value;

        if (obj->top_main_stack == -1)
        {
            obj->min_value = x;
        }

        obj->main_stack[++obj->top_main_stack] = x;

        if (x < obj->min_value)
        {
            obj->min_value = x;
        }

        obj->min_value_stack[++obj->top_min_value_stack] = obj->min_value;
    }
}

void minStackPop(MinStack* obj)
{
    if (obj->top_main_stack != -1)
    {
        --obj->top_main_stack;
    }

    if (obj->top_min_value_stack != -1)
    {
        --obj->top_min_value_stack;

        // 注意最小值也要下移一位
        if (obj->top_min_value_stack != -1)
        {
            obj->min_value = obj->min_value_stack[obj->top_min_value_stack];
        }
    }
}

int minStackTop(MinStack* obj)
{
    return obj->main_stack[obj->top_main_stack];
}

int minStackMin(MinStack* obj)
{
    return obj->min_value;
}

void minStackFree(MinStack* obj)
{
    if (obj != NULL)
    {
        if (obj->main_stack != NULL)
        {
            free(obj->main_stack);
        }
        if (obj->min_value_stack != NULL)
        {
            free(obj->min_value_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);
*/

举报

相关推荐

0 条评论