一、栈的基本概念
栈是一种遵循**后进先出(LIFO)**原则的线性数据结构,仅允许在栈顶进行插入(入栈)和删除(出栈)操作。栈的核心操作包括:
Push: 将元素添加到栈顶。
Pop: 移除并返回栈顶元素。
Peek/Top: 获取栈顶元素但不移除。
IsEmpty: 检查栈是否为空。
二、栈的实现
c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *items; // 动态数组存储栈元素
int top; // 栈顶指针
int capacity; // 栈容量
} Stack;
// 初始化栈
Stack* createStack(int capacity) {
Stack *stack = (Stack*)malloc(sizeof(Stack));
stack->capacity = capacity;
stack->top = -1; // 栈空时top为-1
stack->items = (int*)malloc(capacity * sizeof(int));
return stack;
}
// 检查栈是否为空
int isEmpty(Stack *stack) {
return stack->top == -1;
}
// 检查栈是否已满
int isFull(Stack *stack) {
return stack->top == stack->capacity - 1;
}
// 入栈操作
void push(Stack *stack, int item) {
if (isFull(stack)) {
printf("栈已满,无法入栈\n");
return;
}
stack->items[++stack->top] = item;
}
// 出栈操作
int pop(Stack *stack) {
if (isEmpty(stack)) {
printf("栈为空,无法出栈\n");
exit(EXIT_FAILURE);
}
return stack->items[stack->top--];
}
// 获取栈顶元素
int peek(Stack *stack) {
if (isEmpty(stack)) {
printf("栈为空\n");
exit(EXIT_FAILURE);
}
return stack->items[stack->top];
}
// 释放栈内存
void freeStack(Stack *stack) {
free(stack->items);
free(stack);
}
int main() {
Stack *stack = createStack(5); // 创建容量为5的栈
push(stack, 10);
push(stack, 20);
push(stack, 30);
printf("栈顶元素: %d\n", peek(stack)); // 输出30
printf("出栈元素: %d\n", pop(stack)); // 输出30
freeStack(stack); // 释放内存
return 0;
}
三、关键点说明
动态数组 :通过malloc动态分配内存,支持灵活的容量调整(需自行实现扩容逻辑)。
错误处理:在出栈或获取栈顶元素时检查栈空状态,避免未定义行为。
时间复杂度:所有操作(Push/Pop/Peek)均为 O(1)