数据结构精讲:栈与队列实战指南

上节我们说到数据结构的动态链表实现方式,接下来我们讲一下数据结构中的栈和队列!

一、栈

1.定义

栈(Stack)是一种数据结构,它遵循"先进后出"的原则。也就是说,最后被加入栈中的元素会最先被移除(意思就是栈顶元素先被弹出)。

可以把栈想象成一堆盘子,盘子放得越高,最上面那个盘子就是你最先能拿到的,下面的盘子得等到上面的盘子被拿掉后才能拿到。

图示:

2.什么时候需要使用栈

  • 撤销、回溯:当需要处理"后退"操作时。
  • 递归或嵌套结构:当存在递归调用或嵌套的表达式、结构时。
  • 反向处理数据:当需要按逆序处理数据时。
  • 匹配和验证:当需要检查配对关系(如括号匹配、标签配对等)时。
  • 退出或返回操作:当需要模拟函数调用或"返回"操作时。
  • 有限的数据存储和顺序处理:当需要临时顺序存储并处理有限数据时。
  • 深度优先遍历:在遍历树或图时,栈可以帮助管理当前路径

比方说你想做一个计算器就可以用栈来进行存储数据内容。

3.如何实现栈

我们这里依旧使用的是用数组进行模拟栈。

代码说明:

stk[N]数组来进行存储数据

tt表示栈顶 (我们这里是当tt = 0 表示栈为空)

cpp 复制代码
//插入元素
stk[++tt] = x;

//弹出元素
tt--;

//判断栈是否为空
if(tt == 0) 为空
else 不为空

//访问栈顶元素
stk[tt]

二、队列

1.定义

队列(Queue)是一种线性数据结构,遵循 "先进先出" 的原则。也就是说,最早进入队列的元素会最先被移除,类似排队买票的过程:第一个排队的人先得到服务,最后一个排队的人则要等最久。

队列的基本操作:

  1. Enqueue(入队):将一个元素添加到队列的尾部。
  2. Dequeue(出队):从队列的头部移除一个元素,通常是返回并移除队列中的第一个元素。
  3. Front(队头):返回队列头部的元素,但不移除它。
  4. Rear(队尾):返回队列尾部的元素。
  5. IsEmpty(空队列检查):检查队列是否为空。
  6. Size(队列大小):返回队列中元素的个数。

队列的特点:

  • 先进先出:第一个进入队列的元素会是第一个被移除的元素。
  • 队列中元素的加入和移除操作总是发生在队尾和队头位置。

2.什么时候需要使用队列

按顺序处理任务:例如任务调度、请求处理、打印队列等。

广度优先搜索(BFS):用于按层次顺序遍历图或树。

消息队列:用于消息传递、任务异步处理。

流量控制和缓冲区管理:例如流量控制、生产者-消费者模型。

事件驱动模型:例如GUI事件、用户输入响应等。

缓存管理:例如缓存淘汰(FIFO策略)。

数据流处理:例如音视频流、实时数据传输等。

定时任务调度:确保任务按顺序执行。

进程间通信:多线程/多进程之间的数据传递。

使用队列的关键在于是否需要按顺序处理数据或任务,尤其是当任务或数据进入顺序非常重要时,队列是非常合适的选择。如果你还不确定某个场景是否适合使用队列,考虑是否需要保持顺序分配资源按时间排队处理任务,这些都是队列典型的应用场景。

3.如何实现队列

我们这里同样采用的是用数组进行模拟队列。

代码说明:

q[N] 存储数值

hh 表示对头(设置为0)

tt 表示队尾(设置为-1)

复制代码
//入队
q[++tt] = x;

//出队
hh++;

//判断队列是否为空
if(hh <= tt) 表示为空
else 表示不为空

//取出对头
q[hh];

三、总结

这两个数据的写法比较简单,大家主要是要去理解一下它们的使用场景!!!

.想,全是问题;做,才有答案。大家共勉!

相关推荐
We་ct4 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
JAVA面经实录9177 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
周杰伦fans8 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
叼烟扛炮8 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说9 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove9 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung10 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了10 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL10 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化