大家好,我是帅蛋。
今天,我们将一起探索数据结构中的两大重要成员:栈和队列。它们是线性数据结构的代表,与数组和链表有着千丝万缕的联系。
接下来,让我们看看它们的魅力所在。
文章导读
栈是一种“后进先出”(Last in First Out,简称LIFO)的数据结构。
打个比方,就像的,最后放进的最先被击发,而最先放进的则要等待更久。这就是“后进先出”的原理。
别小看它,栈在编程世界中可是个重要概念。我们每天用的浏览器,它的“后退”功能就与栈息息相关。
以一个实际场景为例解释栈的概念
假设臭宝在浏览@编程文青李狗蛋的技术文章时,不小心点到了一个弹出的框框。这时,他点击了浏览器的“后退”按钮。这个操作就像是在使用栈的出栈功能,带他回到之前的页面。
看,“后退”功能是不是很有用呢?
栈的定义
那么,什么是栈呢?
简单来说,栈是一种限制仅在表的一端(表尾)进行操作(插入和删除)的线性表。
表尾又称作栈顶(Top),允许插入和删除操作;而另一端叫作栈底(Bottom),通常是不能进行操作的第一端。
当元素被加入栈时,我们称之为“入栈”(push);而当元素从栈中移除时,则称之为“出栈”(pop)。
无论是入栈还是出栈操作,都只涉及单个数据的进入或离开,因此它们的时间复杂度和空间复杂度均为O(1)。
栈的存储结构
既然栈是线性表,那么它就有两种主要的存储方式:顺序存储和链式存储。
顺序存储:以数组形式实现
使用数组来实现的栈称为顺序栈。其中,下标为0的一端作为栈底,而使用top来指示当前栈顶元素的位置。当top=-1时,表示栈为空。
链式存储:以链表形式实现
而使用链表实现的栈则称为链栈。链栈通常以单链表的尾节点作为栈底,使用头指针指向的节点作为栈顶。
由于顺序存储和链式存储的特性,顺序栈的元素个数是固定的,满时会停止接收新元素;而链式栈则无此限制,除非内存被完全占满。
队列的定义及特性
与栈不同,队列是一种“先进先出”(First in First Out,简称FIFO)的数据结构。
想象一下排队上厕所的情景,第一个到的人先上,这就是队列的“先进先出”原则。
在软件应用中,队列也随处可见,比如我们在屏幕上看到的字,其实都是字母一个个先后入队再出队的结果。
以一个实例讲解队列的概念
假设我们正在逐个敲打一个字母,那么最先敲打的字母会最先出现在屏幕上,这就是队列的“先进先出”特性。
队列的存储结构
与栈类似,队列也有顺序存储和链式存储两种方式。
链式存储:以链表形式实现队列
链式存储的队列通常使用带头节点的单链表来实现。这样的设计使得入队和出队操作的时间复杂度均为O(1)。