栈(Stack):从原理到实战应用
📚 一、什么是栈?
栈是一种操作受限的线性表,遵循 LIFO(后进先出) 原则。它只允许在栈顶进行插入(push
)和删除(pop
)操作。
核心操作
- Push:元素入栈(栈顶插入)
- Pop:元素出栈(栈顶删除)
- Peek:查看栈顶元素(不删除)
🔧 二、顺序栈的C语言实现
结构体定义
typedef struct stack {
int data[32]; // 存储元素的数组
int top; // 栈顶下标(-1表示空栈)
} Stack;
关键函数解析
1. 初始化栈
void init(Stack *s) {
s->top = -1; // 初始化为空栈
}
2. 入栈操作
void push(Stack *s, int n) {
s->top++;
s->data[s->top] = n;
}
3. 出栈操作
int pop(Stack *s) {
int n = s->data[s->top];
s->top--;
return n;
}
4. 判空与栈大小
bool empty(Stack *s) { return s->top == -1; }
int size(Stack *s) { return s->top + 1; }
🚀 三、栈的实战应用
应用1:进制转换(十进制转二进制)
int main() {
Stack *s = malloc(sizeof(Stack));
init(s);
int n = 666;
while (n != 0) {
push(s, n % 2); // 余数入栈
n /= 2;
}
while (!empty(s)) {
printf("%d", pop(s)); // 逆序输出余数
}
return 0;
}
输出结果:1010011010
应用2:中缀表达式转后缀表达式
以表达式 2+3*(4-6/3)/(2+1)
为例:
步骤 | 当前字符 | 输出队列 | 栈内容 |
---|---|---|---|
1 | 2 | 2 | 空 |
2 | + | 2 | + |
3 | 3 | 2 3 | + |
4 | * | 2 3 | + * |
… | … | … | … |
最终后缀表达式:2 3 4 6 3 / - * 2 1 + / +
🧮 四、后缀表达式求值
对后缀表达式 2 3 4 * + 6 2 / -
的求值过程:
- 遇到数字直接入栈
- 遇到运算符弹出两个操作数计算
- 结果重新入栈
计算过程:
步骤 操作 栈内容
1 2 [2]
2 3 [2, 3]
3 4 [2, 3, 4]
4 * [2, 12] (3*4=12)
5 + [14] (2+12=14)
6 6 [14, 6]
7 2 [14, 6, 2]
8 / [14, 3] (6/2=3)
9 - [11] (14-3=11)
🌟 五、总结
栈在计算机科学中具有重要地位,其应用场景包括:
- 编译器中的语法检查(括号匹配)
- 函数调用栈管理
- 浏览器前进/后退功能
- 深度优先搜索(DFS)算法
附录:代码中未使用的int *p
字段可移除以优化结构体设计。