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

发布于:2025-09-09 ⋅ 阅读:(16) ⋅ 点赞:(0)

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

一、栈

1.定义

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

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

图示:

2.什么时候需要使用栈

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

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

3.如何实现栈

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

代码说明:

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

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

//插入元素
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];

三、总结

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

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


网站公告

今日签到

点亮在社区的每一天
去签到