数据结构:(二)逻辑之门——栈与队列

一、 栈 (Stack):最后进,最先出

栈是仅限在栈顶(Top)进行插入或删除操作的线性表。其核心特性是 LIFO (Last In First Out)

1. 顺序栈的指针含义

在 C 语言实现中,top 指针的定义至关重要。

  • 习惯定义top 指向栈顶元素的下一个位置

  • 空栈条件S.top == S.base

  • 满栈条件S.top - S.base >= S.stacksize

2. 核心算法:入栈与出栈

cs 复制代码
// 入栈 (Push)
Status Push(SqStack &S, ElemType e) {
    if (S.top - S.base >= S.stacksize) return ERROR; // 满栈
    *S.top++ = e; // 先把 e 放入 top 指向的位置,然后 top 指针自增 1
    return OK;
}

// 出栈 (Pop)
Status Pop(SqStack &S, ElemType &e) {
    if (S.top == S.base) return ERROR; // 空栈
    e = *--S.top; // top 先减 1 指向栈顶元素,再取出赋值给 e
    return OK;
}

二、 栈的顶级应用:括号匹配 (Parenthesis Matching)

这是一个典型的"后进先出"场景:最后出现的左括号,必须最先被匹配掉。

算法精髓:

  1. 遇到左括号 :它是期待被匹配的,先"存"起来 ------ 压栈

  2. 遇到右括号 :它来寻找匹配对象,找谁?找最近出现的那个左括号 ------ 弹出栈顶检查

  3. 匹配失败的三种情况

    • 遇到右括号但栈已空(右括号多余)。

    • 弹出的左括号与当前右括号不匹配(如 [))。

    • 遍历结束但栈不为空(左括号多余)。


三、 队列 (Queue):先进先出,公平至上

队列是只允许在队尾 (Rear) 插入、队头 (Front) 删除的线性表。其特性是 FIFO (First In First Out)

1. 循环队列 (Circular Queue):解决"假溢出"

在顺序存储下,随着出队入队,指针会一直向后移动直到超出界限。为了重复利用空间,我们将数组想象成一个"环"。

  • 核心公式 :利用模运算 %

  • 指针后移i = (i + 1) % MAXSIZE;

2. 难点:如何区分队空还是队满?

front == rear 时,队列可能空也可能满。

严版教材方案:牺牲一个单元。

  • 队空Q.front == Q.rear

  • 队满(Q.rear + 1) % MAXSIZE == Q.front

  • 队列长度计算 (高频考点):(Q.rear - Q.front + MAXSIZE) % MAXSIZE


四、 深度复盘:递归与栈的灵魂绑定

很多初学者不理解为什么递归需要栈。

详细注释

当一个函数(调用者)调用另一个函数(被调用者)时,系统必须保存调用者的"断点"信息(局部变量、返回地址等)。这些信息被压入系统栈。被调用者执行完后,从栈顶弹出信息恢复调用者。

递归 就是一种特殊的嵌套调用,它不断地把每一层的信息压栈。如果递归没有出口,栈就会被撑爆,产生著名的 Stack Overflow 错误。


五、 今日对比小结

结构 逻辑规则 插入/删除位置 典型应用
LIFO 都在栈顶 括号匹配、表达式求值、递归
队列 FIFO 队尾入、队头出 打印机任务、缓冲区、BFS(广搜)

今日踩坑提醒:

  • 顺序栈 Pop 时,指针是先自减还是先取值?一定要看 top 的初始定义。

  • 循环队列的 MAXSIZE 并不是实际能存的元素个数,如果采取"牺牲一个单元"法,只能存 MAXSIZE - 1 个。

相关推荐
是未才10 分钟前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio38 分钟前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
罗西的思考1 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX2 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
萧瑟余晖2 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
爱跳舞的烤冷面2 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号2 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽3 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI3 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
MC皮蛋侠客4 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis