栈与队列
申明:由于篇幅限制,文章可能有些简略,如果大家想要详细了解,请一定要百度一下,并阅读例题,完成习题
绪言:计算机科学在过去的数十年内发展飞速,各种新颖的技术纷至沓来:5G,VR,AI;大数据,可视化,区块链;品种多样,令人目不暇接。可是在这繁多的技术与科技背后,却隐藏这这样一个亘古不变的公式。算法 + 数据结构 = 大千世界
算法的定义:解题方案的准确而完整的描述,是一系列解决问题的清晰指令。
数据结构的定义:计算机存储、组织数据的方式。
今天,让我们从最基础的数据结构——栈(Stack)和队列(Queue)开始,透过大千世界的幻影探索它的真实。
栈和队列可以说是每一本的数据结构书都会加以介绍的最基本的数据结构,也是为数不多的线性数据结构。它们是所有数据结构初学者所必须掌握的知识。
栈在百度百科上的定义:又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。如图
队列在百度百科上的定义:和栈一样,队列是一种操作受限制的线性表,不同之处在于它只允许在表头进行删除操作,在表尾进行插入操作。如图。
由于都是受限制的线性表,所以在定义这两种数据结构的时候都只需要一个线性表A ,但在这两种数据由于操作不同,我们也需要两组不同的指针加以甄别。如图所示:
栈和队列的操作很简单,栈只有在表尾进行插入和删除操作,也就是入栈和出栈;而队列也仅有在表尾进行插入和表头进行删除,也就是入队和出队操作。如图:
上诉代码实现了一个基本的栈和队列的功能,有兴趣的同学可以把这段代码copy后运行,自己编制几组数据进行检验,如果能够用草稿纸模拟一下过程是再好不过。
只不过,唯一有一些可惜的是上述代码中队列的实现似乎有一些浪费额外空间,这是由于队列进行出队操作后,队首指针之前的数据没有了再使用的可能性,却依然占用空间导致,这种队列称为顺序队列。
解决方法有两种,一种是使用链表来实现队列,在队首元素出队后,直接释放指针空间,这种队列称为链式队列;另一种方法就是使用循环队列。如图:
循环队列的核心是:在一定宽度范围内,保证每一个队内的元素反复使用宽度内的空间。实现的方式就是模运算一旦队尾或者队首超过宽度限制,通过取余运算使之返回限定的宽度的头部。
这样,通过模运算,使得整个序列的宽度限制在lim内。值的一提的是,这时已经不能用p>q来表示队列已空,因为队列循环的情况下p>q是合法的。
通过以上的描述,大家可能对栈和队列的基本知识有一定的了解,现在给出两道例题,尝试用这两种数据结构去解决一些实际问题。
上述两道题详细的向我们描述了应该如何用栈和队列这种数据结构去解题。请详细揣摩,如果能够代码实现,一定会有很大的收获。
从此,通过栈和队列中两种里程碑式的数据结构,我们进入了它的大门,而这也是我们学习它的开始。
下面给出一些练习题,如果有兴趣,大家可以去尝试一二。
T1:https://www.luogu.com.cn/problem/P1044 栈的基础知识理解。
T2:https://www.luogu.com.cn/problem/UVA12265 类似例题1
T3:https://www.luogu.com.cn/problem/P1823 二分+栈
T4:https://www.luogu.com.cn/problem/P1886 例题2模板题
谢谢阅读。
写留言