剑指面试题30. 包含min函数的栈 (构造数据结构和每次压栈两次两种解法)

18 篇文章 0 订阅
13 篇文章 0 订阅

解法1:构造合适的数据结构

        根据题意,构造合适的数据结构,一个Data是一个栈元素,其中val是当前栈的数值元素,prim_min记录的是当前栈之前所有数值元素的最小值,若需要知道当前元素的最小值,只需要求得min(val, prim_min)即可。

       构造数据结构时,用时需要仔细区分->和.来正确访问元素。

#define N 10000
#define Min(x,y) ((x)<(y)?(x):(y))

typedef struct {         //构造合适的数据结构
    int val;             //当前栈元素
    int prim_min;        //原来栈中最小值
} Data;
typedef struct {
    Data * data;
    int top;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack *obj = (MinStack *)calloc(1, sizeof(MinStack));
    obj->data = (Data *)calloc(N, sizeof(Data));
    obj->top = -1;

    return obj;
}

void minStackPush(MinStack* obj, int x) {
    Data tmp;
    tmp.val = x;
    if (obj->top == -1)
        tmp.prim_min = x;
    else
        tmp.prim_min = Min((obj->data[obj->top]).prim_min, x);

    obj->top++;
    obj->data[obj->top] = tmp;
}

void minStackPop(MinStack* obj) {
    if (obj->top > -1)
        obj->top--;
    else
        printf("stack error!\n");
}

int minStackTop(MinStack* obj) {
    return obj->data[obj->top].val;
}

int minStackMin(MinStack* obj) {
    return obj->data[obj->top].prim_min;
}

void minStackFree(MinStack* obj) {
    free(obj->data);
    free(obj);
}

解法2:每次压栈两次,一次是数值,一次是之前元素的最小值

#define N 20000
#define Min(x,y) ((x)<(y)?(x):(y))
typedef struct {
    int* data;
    int top;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack *obj = (MinStack *)calloc(1, sizeof(MinStack));
    obj->data = (int *)calloc(N, sizeof(int));
    obj->top = -1;

    return obj;
}

void minStackPush(MinStack* obj, int x) {
    if (obj->top == -1) {
        obj->data[++obj->top] = x;
        obj->data[++obj->top] = x;
    } else {
        obj->data[++obj->top] = x;
        obj->data[++obj->top] = Min(x, obj->data[obj->top - 1]);
    }
}

void minStackPop(MinStack* obj) {
    if (obj->top > -1)
        obj->top -= 2;
    else
        printf("stack error!\n");
}

int minStackTop(MinStack* obj) {
    return obj->data[obj->top - 1];
}

int minStackMin(MinStack* obj) {
    return obj->data[obj->top];
}

void minStackFree(MinStack* obj) {
    free(obj->data);
    free(obj);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值