news 2026/10/19 5:02:52

第3讲:栈和队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第3讲:栈和队列

目录

  • 本节目标
  • 1. 栈
    • 1.1 栈的概念及结构
    • 1.2 栈的实现
  • 2. 队列
    • 2.1 队列的概念及结构
    • 2.2 队列的实现
  • 3. 栈和队列面试题
  • 4. 概念选择题
    • 选择题
    • 答案

本节目标

  1. 栈
  2. 队列
  3. 栈和队列面试题

1. 栈

1.1 栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

1.2 栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。


// 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈typedefintSTDataType;#defineN10typedefstructStack{STDataType _a[N];int_top;// 栈顶}Stack;// 支持动态增长的栈typedefintSTDataType;typedefstructStack{STDataType*_a;int_top;// 栈顶int_capacity;// 容量}Stack;// 初始化栈voidStackInit(Stack*ps);// 入栈voidStackPush(Stack*ps,STDataType data);// 出栈voidStackPop(Stack*ps);// 获取栈顶元素STDataTypeStackTop(Stack*ps);// 获取栈中有效元素个数intStackSize(Stack*ps);// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0intStackEmpty(Stack*ps);// 销毁栈voidStackDestroy(Stack*ps);

2. 队列

2.1 队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。

入队列:进行插入操作的一端称为队尾;出队列:进行删除操作的一端称为队头。

2.2 队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

// 链式结构:表示队列typedefstructQListNode{structQListNode*_pNext;QDataType _data;}QNode;// 队列的结构typedefstructQueue{QNode*_front;QNode*_rear;}Queue;// 初始化队列voidQueueInit(Queue*q);// 队尾入队列voidQueuePush(Queue*q,QDataType data);// 队头出队列voidQueuePop(Queue*q);// 获取队列头部元素QDataTypeQueueFront(Queue*q);// 获取队列队尾元素QDataTypeQueueBack(Queue*q);// 获取队列中有效元素个数intQueueSize(Queue*q);// 检测队列是否为空,如果为空返回非零结果,如果非空返回0intQueueEmpty(Queue*q);// 销毁队列voidQueueDestroy(Queue*q);

另外扩展了解一下,实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。

3. 栈和队列面试题

  1. 括号匹配问题。20. 有效的括号
  2. 用队列实现栈。225. 用队列实现栈
  3. 用栈实现队列。232. 用栈实现队列
  4. 设计循环队列。622. 设计循环队列

4. 概念选择题

选择题

  1. 一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是( )。

    • A.12345ABCDE
    • B.EDCBA54321
    • C.ABCDE12345
    • D.54321EDCBA
  2. 若进栈序列为1,2,3,4,进栈过程中可以出栈,则下列不可能的一个出栈序列是()。

    • A.1,4,3,2
    • B.2,3,4,1
    • C.3,1,4,2
    • D.3,4,2,1
  3. 循环队列的存储空间为Q(1:100),初始状态为front=rear=100。经过一系列正常的入队与退队操作后,front=rear=99,则循环队列中的元素个数为()。

    • A. 1
    • B. 2
    • C. 99
    • D. 0 或者 100
  4. 以下( )不是队列的基本运算?

    • A. 从队尾插入一个新元素
    • B. 从队列中删除第i个元素
    • C. 判断一个队列是否为空
    • D. 读取队头元素的值
  5. 现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为?(假设队头不存放数据)

    • A.(rear - front + N) % N + 1
    • B.(rear - front + N) % N
    • C.(rear - front) % (N + 1)
    • D.(rear - front + N) % (N - 1)

答案

  1. B
  2. C
  3. D
  4. B
  5. B
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 5:02:02

K8s 排查实战:Nginx Pod CrashLoopBackOff 根因定位与预防

K8s 里最让人头皮发麻的状态之一,就是 Nginx Pod 一直 CrashLoopBackOff。你看着它明明处于 Running,READY 却永远是 0/1,RESTARTS 每隔几十秒就加一,流量全部 5xx。更坑的是,这种状态通常不会在事件里直接告诉你“这里…

作者头像 李华
网站建设 2026/10/19 5:02:01

SSRF叠加Redis未授权访问:一条直通内网的完整攻击链解析

SSRF加上Redis未授权访问,这两个词出现在同一个漏洞报告里,几乎就是"内网失守"的前奏。我前阵子在一次授权的红队演练里完整走了一遍这条链路,既帮应用团队验证了SSRF的影响面,也帮运维检查Redis部署里那些历史遗留问题…

作者头像 李华
网站建设 2026/10/19 5:01:45

Open Code Review:可编程、可审计的开源代码评审范式

1. “open-code-review”不是新工具,而是一套可落地的开源代码评审范式“open-code-review”这个词最近在技术社区里频繁出现,但很多人第一次看到时会下意识以为它是个新发布的 CLI 工具、某个 GitHub 仓库名,或者某家创业公司刚推出的 SaaS …

作者头像 李华
网站建设 2026/10/19 5:01:22

open-code-review:基于CLI与Git Diff的代码审查新范式

1. “open-code-review”不是新工具,而是代码审查范式的悄然迁移最近在几个技术群和内部分享里,频繁看到有人问:“open-code-review 是不是 DeepSeek 或 Claude 推的新 CLI?是不是 Codex CLI 的开源替代?”——这其实暴…

作者头像 李华
网站建设 2026/10/19 5:00:54

语义分割替代霍夫变换:工业仪表表盘轮廓提取新范式

简介:本资源是一份面向工业智能化巡检场景的Python图像识别系统设计论文,适用于自动化、仪器仪表、计算机视觉方向的本科生、研究生及现场工程师,解决指针式模拟仪表人工读数效率低、无人巡检落地难的核心痛点。论文提出基于DeepLabV3语义分割…

作者头像 李华
网站建设 2026/10/19 5:00:19

open-code-review:开源代码评审流程搭建与团队落地实践指南

收到项目标题:open-code-review,结合近期团队协作中大家对代码评审这件事的关注度,我来把整套落地方案从头到尾捋一遍。里面没有任何宣传性质的内容,全部是我这些年在实际项目里跑出来的经验教训,包括怎么选型、怎么定…

作者头像 李华