实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。c语言
时间: 2024-10-09 10:05:06 浏览: 63
在C语言中,我们可以实现一个名为`MinMaxStack`的自定义数据结构,它同时具备普通栈的功能(如压入、弹出操作)以及找到栈中最小元素的能力。这里我们可以使用两个指针,一个指向当前栈顶,另一个称为`minIndex`,始终跟踪栈中的最小值。
```c
#include <stdio.h>
#include <stdlib.h>
// 结构体表示我们的 MinMaxStack
typedef struct {
int* data; // 存储元素的数组
size_t top; // 栈顶索引
size_t minIndex; // 最小元素索引
int capacity; // 容量
} MinMaxStack;
// 初始化一个新的栈
MinMaxStack* init_MinMaxStack(int capacity) {
MinMaxStack* stack = (MinMaxStack*)malloc(sizeof(MinMaxStack));
if (!stack) {
return NULL;
}
stack->data = malloc(capacity * sizeof(int));
if (!stack->data) {
free(stack);
return NULL;
}
stack->top = -1;
stack->minIndex = -1;
stack->capacity = capacity;
return stack;
}
// 压入元素
void push(MinMaxStack* stack, int value) {
if (stack->top == stack->capacity - 1) {
printf("Stack is full.\n");
return;
}
stack->data[++stack->top] = value;
// 如果这是第一个元素或者新值比当前最小值小
if (stack->minIndex == -1 || value <= stack->data[stack->minIndex]) {
stack->minIndex = stack->top;
}
}
// 弹出栈顶元素并更新最小值
int pop_and_min(MinMaxStack* stack) {
if (stack-1) {
printf("Stack is empty.\n");
return -1;
}
int poppedValue = stack->data[stack->top--];
// 如果栈顶就是之前记录的最小值,需要更新minIndex
if (poppedValue == stack->data[stack->minIndex]) {
stack->minIndex = stack->top >= stack->minIndex ? -1 : stack->top;
}
return poppedValue;
}
// 返回栈中的最小元素
int get_min(MinMaxStack* stack) {
if (stack->minIndex == -1) {
return -1; // 空栈或只包含单个元素时没有最小值
} else {
return stack->data[stack->minIndex];
}
}
// 清理资源
void destroy_MinMaxStack(MinMaxStack* stack) {
free(stack->data);
free(stack);
}
int main() {
MinMaxStack* stack = init_MinMaxStack(5);
push(stack, 5);
push(stack, 3);
push(stack, 7);
printf("Min element: %d\n", get_min(stack)); // 输出3
int poppedValue = pop_and_min(stack);
printf("Popped value and new min: %d, %d\n", poppedValue, get_min(stack)); // 输出7, 3
destroy_MinMaxStack(stack);
return 0;
}
```
这个实现的关键在于维护最小值索引,并在压入和弹出元素时相应地更新它。当你需要查询最小元素时,直接从该索引位置获取即可。
阅读全文