diff options
| author | yingyu5658 <i@yingyu5658.me> | 2025-12-13 08:33:08 +0800 |
|---|---|---|
| committer | yingyu5658 <i@yingyu5658.me> | 2025-12-13 08:33:08 +0800 |
| commit | 1e5f8eb33bc41cb59faf059e83701152785cabea (patch) | |
| tree | 45867273ac2178285be840764f7962d2b55556c6 /content/posts/【数据结构与算法】栈.md | |
| download | blog-1e5f8eb33bc41cb59faf059e83701152785cabea.tar.gz blog-1e5f8eb33bc41cb59faf059e83701152785cabea.zip | |
Initial commit
Diffstat (limited to 'content/posts/【数据结构与算法】栈.md')
| -rw-r--r-- | content/posts/【数据结构与算法】栈.md | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/content/posts/【数据结构与算法】栈.md b/content/posts/【数据结构与算法】栈.md new file mode 100644 index 0000000..b41b715 --- /dev/null +++ b/content/posts/【数据结构与算法】栈.md @@ -0,0 +1,107 @@ +--- +abbrlink: 3557841346 +categories: +- 往昔 +date: "2025-05-11 10:09:21" +tags: +- 数据结构与算法 +title: 【数据结构与算法】栈 +--- + +## 基本概念 + +栈(Stack)是一种后进先出(LIFO)原则的线性数据结构。核心操作包括: + +- 压栈(Push):将元素添加到栈顶 +- 出栈(Pop):移除并返回栈顶元素 +- 查看栈顶(Check)获取但移除栈顶元素 +- 判空(is_empty)检查栈是否为空 + +## 结构定义 + +使用动态数组实现栈,包含三个核心属性: + +```c +typedef struct Stack { + int* data; // 存储元素的数组 + int top; // 栈顶指针(当前元素位置) + int capacity; // 栈的最大容量 +} +``` + +- `data`:动态分配的数组指针 +- `top`:初始值为-1,表示空栈,压栈时递增,出栈时递减 +- `capacity`:栈的容量上限 + +## 功能实现 + +### 初始化 + +```c +// 初始化栈 +void init_stack(Stack *s, int capacity) { + // 计算最大容量 + s -> data = (int*)malloc(sizeof(int) * capacity) + if(!s -> data) { + printf("内存分配失败!\n"); + exit(1); + } + // 初始化栈顶为-1,表空 + s -> top = -1; + // 把当前计算的最大容量赋值给传进来的栈 + s -> capacity = capacity; +} +``` + +这个函数中进行了动态分配内存计算最大容量,初始化赋值和异常处理。 + +### 压栈(Push) + +```c +// 压栈(Push) +void push(Stack *s, int value) { + if (s -> top = s -> capacity -1) { + printf("栈已满!\n"); + return; + } + s -> data[++s->top] = value; +} +``` + +检查栈是否已满,先递增指针再存入数据 + +### 出栈(Pop) + +```c +// 出栈(Pop) +int pop(Stack *s) { + if(is_empty(s)) { + printf("栈为空!\n"); + return -1; + } + return s->data[s->top--]; +} +``` + +检查栈是否为空,返回当前栈顶元素后移动指针 + +### 辅助功能 + +```c +// 判空 +int is_empty(Stack *s) { + return s-> top == -1 +} + +// 查看栈顶元素 +int peek(Stack *s) { + return is_empty(s) ? -1 : s->data[s->top]; +} + +// 销毁 +void destory_stack(Stack *S) { + free(s->data); + s -> top = -1; + s -> capacity = 0; +} +``` |
