前言
简介:
你有没有想过,为什么我们吃饭的时候,总是先吃掉最后放进嘴里的那一口?为什么我们排队的时候,总是先让最先来的人先走?这些生活中的现象,其实都和栈和队列的数据结构有关。
栈和队列是两种常见的数据结构,它们分别对应了后进先出(LIFO)和先进先出(FIFO)的原则。
栈就像是一叠盘子,你只能从最上面拿走或放上一个盘子,这个盘子就是栈顶。
队列就像是一条长龙,你只能从尾巴加入或从头部离开,这两个位置就是队尾和队首。
本文将向你大致介绍栈和队列的概念、特征和应用场景。
注:
本博客为本人在学习数据结构路途上的知识整理,如觉得对有你有所帮助,还希望不要吝啬你的赞,整理知识点是真的很累|*´Å`)ノ 。由于博主只是一名大一新生,在文章难免会出现错误,还希望指正。如果想要转载,附上链接就行。
本文中的颜色标记
- 红色部分为重点内容
- 蓝色部分为注释
一、栈和队列的概念
栈
定义:
- 栈(stack)是一个特殊的线性表,是限定仅在一端(通常是表尾)
进行插入和删除操作的线性表。 - 又称为后进先出(Last In First Out) 的线性表,简称LIFO结构
相关概念:
- 表尾(即an端)称为栈顶Top
- 表头(即a1端)称为栈底Base
例如:栈S=(a1,a2,a3...,an1,an)a1称为栈底元素,an称为栈顶元素
- 插入元素到栈顶(即表尾)的操作,称为入栈(PUSH)
- 从栈顶(即表尾)删除最后一个元素的操作,称为出栈(POP)
栈只能在栈顶进行插入和删除的操作,只能在an-1尾部进行插入,插入an之后,只能先删除an然后再删除an-1
逻辑结构
与同线性表相同,仍为一对一关系。
存储结构
用顺序栈或链栈存储均可,但以顺序栈更常见
运算规则
只能在栈顶运算,且访问结点时依照后进先出(LIFO)的原则。
实现方式
关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同
栈与一般线性表的区别
- 仅在于运算规则不同
队列
定义:
- 队列(queue)是一种在表一端插入(表尾),在另一端(表头)删除的线性表。
- 又称为先进先出(FristInFristOut)的线性表,简称FIFO结构。
相关概念
- 表尾(即an端)称为队尾
- 表头(即a1端)称为队首
- 插入元素到队尾(即表尾)的操作,称为入队(PUSH)
- 从队首(即表头)删除第一个元素的操作,称为出队(POP)
逻辑结构
与同线性表相同,仍为一对一关系。
存储结构
顺序队或链队,以循环顺序队列更常见。
运算规则
只能在队首和队尾运算,直访问结点时依照先进先出(FIFO)的原则
实现方式
关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同
栈和队列的实际运用
栈的实际运用
- 括号匹配问题(20. 有效的括号 - 力扣(Leetcode))
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
解题步骤:
①将s依次栈入栈
②将s栈入的时候进行判段,为左括号直接栈入
③如果为右括号,判断是否与栈顶匹配,匹配则将栈顶栈出
④如果右括号与栈顶不匹配,则为非有效的括号,直接结束函数。
队列的实际运用
舞伴问题
假设在舞会上,男士和女士各自排成一队。舞会开始依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
显然,先入队的男士或女士先出队配成舞伴。因此该问题具有典型的先进先出特性,可以用队列作为算法的数据结构。
①首先构造两个队列
②依次将队头元素出队配成舞伴
③某队为空,则另外一队等待着则是下一舞曲第一个
可获得舞伴的人。
总结
这篇博客中我大致介绍了栈和队列的定义,基本概念和实际应用的例子。栈和队列总结一下就是,栈是遵循后进先出原则的线性表,队列是遵循先进先出原则的线性表。在解决实际问题时,如果这个问题具有先进后出或者后进先出的特点,例如括号匹配和舞伴配对等,我们就可以使用栈或者队列来解决这个问题。下一篇博客,我们将介绍栈和队列的具体代码实现。
由于最近要c++期末考,这个星期可能没时间更新了,下个星期我再爆肝。