【刷题】P165剑指offer:面试题30:包含min函数的栈(使用指针并非实现)

面试题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);
*/

猜你喜欢

转载自blog.csdn.net/m0_46613023/article/details/115005626
今日推荐