summaryrefslogtreecommitdiffstats
path: root/content/posts/【数据结构与算法】栈.md
diff options
context:
space:
mode:
authoryingyu5658 <i@yingyu5658.me>2025-12-13 08:33:08 +0800
committeryingyu5658 <i@yingyu5658.me>2025-12-13 08:33:08 +0800
commit1e5f8eb33bc41cb59faf059e83701152785cabea (patch)
tree45867273ac2178285be840764f7962d2b55556c6 /content/posts/【数据结构与算法】栈.md
downloadblog-1e5f8eb33bc41cb59faf059e83701152785cabea.tar.gz
blog-1e5f8eb33bc41cb59faf059e83701152785cabea.zip
Initial commit
Diffstat (limited to 'content/posts/【数据结构与算法】栈.md')
-rw-r--r--content/posts/【数据结构与算法】栈.md107
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;
+}
+```