栈(Stack):从原理到实战应用

栈(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) 为例:

步骤当前字符输出队列栈内容
122
2+2+
332 3+
4*2 3+ *

最终后缀表达式:2 3 4 6 3 / - * 2 1 + / +


🧮 四、后缀表达式求值

对后缀表达式 2 3 4 * + 6 2 / - 的求值过程:

  1. 遇到数字直接入栈
  2. 遇到运算符弹出两个操作数计算
  3. 结果重新入栈

计算过程

步骤  操作    栈内容
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字段可移除以优化结构体设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值