📅  最后修改于: 2023-12-03 15:10:14.355000             🧑  作者: Mango
这道题目要求程序员使用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
,以便运行和测试。