📌  相关文章
📜  教资会网络 | UGC NET CS 2014 年 12 月 – II |问题 49(1)

📅  最后修改于: 2023-12-03 15:10:14.355000             🧑  作者: Mango

教资会网络 | UGC NET CS 2014 年 12 月 – II |问题 49

这道题目要求程序员使用C语言实现一个栈,同时还需能够输出栈的最小值。

下面是一个示例程序:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

struct stack {
    int data[MAX_SIZE];
    int min[MAX_SIZE];
    int top;
};

void init_stack(struct stack *s) {
    s->top = -1;
}

int is_empty(struct stack *s) {
    return s->top == -1;
}

int is_full(struct stack *s) {
    return s->top == MAX_SIZE - 1;
}

void push(struct stack *s, int x) {
    if (is_full(s)) {
        printf("Stack full, cannot push anymore.\n");
        return;
    }

    if (is_empty(s) || x < s->min[s->top]) {
        s->min[++s->top] = x;
    } else {
        s->min[s->top + 1] = s->min[s->top];
        s->top++;
    }

    s->data[s->top] = x;
}

int pop(struct stack *s) {
    if (is_empty(s)) {
        printf("Stack empty, cannot pop anymore.\n");
        return -1;
    }

    int x = s->data[s->top--];

    return x;
}

int get_min(struct stack *s) {
    return s->min[s->top];
}

void print_stack(struct stack *s) {
    if (is_empty(s)) {
        printf("Stack empty.\n");
        return;
    }

    for (int i = 0; i <= s->top; ++i) {
        printf("%d ", s->data[i]);
    }

    printf("\n");
}

int main() {
    struct stack s;
    init_stack(&s);

    push(&s, 3);
    push(&s, 5);
    push(&s, 2);
    push(&s, 7);
    push(&s, 1);
    push(&s, 8);

    printf("Stack after pushing 3, 5, 2, 7, 1, 8: ");
    print_stack(&s);

    printf("Minimum value in the stack: %d\n", get_min(&s));

    pop(&s);
    pop(&s);

    printf("Stack after popping 1, 8: ");
    print_stack(&s);

    printf("Minimum value in the stack: %d\n", get_min(&s));

    return 0;
}

上述程序使用了一个结构体来实现栈,其中除了存储数据之外,还存储了栈中的最小值。

该程序在插入数据时,会判断当前数据是否小于栈中的最小值,如果是,则将当前数据作为新的最小值存储起来,否则将之前最小值的副本存储。

在弹出数据时,只需要按照正常的栈操作弹出数据,并返回弹出的数据。

需要注意的是,由于栈的最小值是根据当前栈中的数据计算而得,因此在每次向栈中插入、删除数据时,都需要重新计算最小值并更新结构体中的数据。

该程序建议放在单独的文件中,并将入口函数命名为main,以便运行和测试。