数据结构精讲:栈与队列实战指南
上节我们说到数据结构的动态链表实现方式,接下来我们讲一下数据结构中的栈和队列!
一、栈
1.定义
栈(Stack)是一种数据结构,它遵循“先进后出”的原则。也就是说,最后被加入栈中的元素会最先被移除(意思就是栈顶元素先被弹出)。
可以把栈想象成一堆盘子,盘子放得越高,最上面那个盘子就是你最先能拿到的,下面的盘子得等到上面的盘子被拿掉后才能拿到。
图示:
2.什么时候需要使用栈
- 撤销、回溯:当需要处理“后退”操作时。
- 递归或嵌套结构:当存在递归调用或嵌套的表达式、结构时。
- 反向处理数据:当需要按逆序处理数据时。
- 匹配和验证:当需要检查配对关系(如括号匹配、标签配对等)时。
- 退出或返回操作:当需要模拟函数调用或“返回”操作时。
- 有限的数据存储和顺序处理:当需要临时顺序存储并处理有限数据时。
- 深度优先遍历:在遍历树或图时,栈可以帮助管理当前路径
比方说你想做一个计算器就可以用栈来进行存储数据内容。
3.如何实现栈
我们这里依旧使用的是用数组进行模拟栈。
代码说明:
stk[N]数组来进行存储数据
tt表示栈顶 (我们这里是当tt = 0 表示栈为空)
//插入元素
stk[++tt] = x;//弹出元素
tt--;//判断栈是否为空
if(tt == 0) 为空
else 不为空//访问栈顶元素
stk[tt]
二、队列
1.定义
队列(Queue)是一种线性数据结构,遵循 “先进先出” 的原则。也就是说,最早进入队列的元素会最先被移除,类似排队买票的过程:第一个排队的人先得到服务,最后一个排队的人则要等最久。
队列的基本操作:
- Enqueue(入队):将一个元素添加到队列的尾部。
- Dequeue(出队):从队列的头部移除一个元素,通常是返回并移除队列中的第一个元素。
- Front(队头):返回队列头部的元素,但不移除它。
- Rear(队尾):返回队列尾部的元素。
- IsEmpty(空队列检查):检查队列是否为空。
- Size(队列大小):返回队列中元素的个数。
队列的特点:
- 先进先出:第一个进入队列的元素会是第一个被移除的元素。
- 队列中元素的加入和移除操作总是发生在队尾和队头位置。
2.什么时候需要使用队列
按顺序处理任务:例如任务调度、请求处理、打印队列等。
广度优先搜索(BFS):用于按层次顺序遍历图或树。
消息队列:用于消息传递、任务异步处理。
流量控制和缓冲区管理:例如流量控制、生产者-消费者模型。
事件驱动模型:例如GUI事件、用户输入响应等。
缓存管理:例如缓存淘汰(FIFO策略)。
数据流处理:例如音视频流、实时数据传输等。
定时任务调度:确保任务按顺序执行。
进程间通信:多线程/多进程之间的数据传递。
使用队列的关键在于是否需要按顺序处理数据或任务,尤其是当任务或数据进入顺序非常重要时,队列是非常合适的选择。如果你还不确定某个场景是否适合使用队列,考虑是否需要保持顺序、分配资源或按时间排队处理任务,这些都是队列典型的应用场景。
3.如何实现队列
我们这里同样采用的是用数组进行模拟队列。
代码说明:
q[N] 存储数值
hh 表示对头(设置为0)
tt 表示队尾(设置为-1)
//入队
q[++tt] = x;//出队
hh++;//判断队列是否为空
if(hh <= tt) 表示为空
else 表示不为空//取出对头
q[hh];
三、总结
这两个数据的写法比较简单,大家主要是要去理解一下它们的使用场景!!!
.想,全是问题;做,才有答案。大家共勉!