设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。\n\npush(x) —— 将元素 x 推入栈中。\npop() —— 删除栈顶的元素。\ntop() —— 获取栈顶元素。C语言代码
时间: 2024-09-30 09:10:22 浏览: 53
设计这样的栈,我们可以采用一种叫做“带最小值的栈”(MinStack)的数据结构。它不仅包含常规的栈元素,还维护一个额外的指针来追踪当前栈中的最小元素。下面是 C 语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义 MinStack 结构体
typedef struct {
int* stack; // 栈数组
int top; // 栈顶元素索引
int min_index; // 最小值的索引
int size; // 当前大小
} MinStack;
// 初始化一个新的 MinStack
MinStack* createMinStack() {
MinStack* s = (MinStack*)malloc(sizeof(MinStack));
if (!s) return NULL;
s->stack = NULL;
s->top = -1;
s->min_index = -1;
s->size = 0;
return s;
}
// 压栈操作
void push(MinStack* s, int x) {
if (s->top == s->size - 1) {
s->stack = realloc(s->stack, (s->size *= 2) + sizeof(int));
if (!s->stack) {
free(s);
s = NULL;
return;
}
}
s->stack[++s->top] = x;
// 更新最小值
if (s->top == s->min_index || x <= s->stack[s->min_index]) {
s->min_index = s->top;
}
}
// 出栈操作
int pop(MinStack* s) {
if (s-1; // 空栈
int x = s->stack[s->top];
s->stack[s->top--] = 0; // 清空栈顶位置
// 如果删除的是最小值,更新最小值
if (x == s->stack[s->min_index]) {
if (s->top != s->min_index) {
s->min_index--;
} else {
while (s->top >= 0 && s->stack[s->top] > s->stack[s->min_index]) {
s->min_index++;
}
}
}
return x;
}
// 获取栈顶元素
int top(MinStack* s) {
return s->top == -1 ? -1 : s->stack[s->top];
}
// 查找并返回最小值
int getMin(MinStack* s) {
return s->stack[s->min_index];
}
// 释放内存
void destroyMinStack(MinStack* s) {
if (s && s->stack) free(s->stack);
free(s);
}
int main() {
MinStack* stack = createMinStack();
push(stack, -2);
push(stack, 0);
push(stack, -3);
printf("Top: %d, Min: %d\n", top(stack), getMin(stack)); // 输出:Top: 0, Min: -3
pop(stack);
printf("Top: %d, Min: %d\n", top(stack), getMin(stack)); // 输出:Top: -2, Min: -2
destroyMinStack(stack);
return 0;
}
```
这个实现中,`push`、`pop` 和 `top` 的操作时间复杂度都是 O(1),而 `getMin` 的时间复杂度也是 O(1),因为我们在压栈时就维护了最小值。
阅读全文