初学数据结构——从零开始的数据结构学习第六天(初识栈和队列)

本文介绍了栈和队列这两种基本数据结构,包括它们的定义、特性以及在括号匹配和舞伴配对问题中的应用。栈遵循后进先出(LIFO)原则,常用于处理类似括号匹配的问题;队列则遵循先进先出(FIFO)原则,如在解决舞伴配对问题时发挥作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

简介:

你有没有想过,为什么我们吃饭的时候,总是先吃掉最后放进嘴里的那一口?为什么我们排队的时候,总是先让最先来的人先走?这些生活中的现象,其实都和栈和队列的数据结构有关。

栈和队列是两种常见的数据结构,它们分别对应了后进先出(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)的原则

实现方式

关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同

栈和队列的实际运用

栈的实际运用

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

解题步骤:

①将s依次栈入栈

②将s栈入的时候进行判段,为左括号直接栈入

③如果为右括号,判断是否与栈顶匹配,匹配则将栈顶栈出

④如果右括号与栈顶不匹配,则为非有效的括号,直接结束函数。

队列的实际运用

舞伴问题

假设在舞会上,男士和女士各自排成一队。舞会开始依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。

显然,先入队的男士或女士先出队配成舞伴。因此该问题具有典型的先进先出特性,可以用队列作为算法的数据结构。

①首先构造两个队列

②依次将队头元素出队配成舞伴

③某队为空,则另外一队等待着则是下一舞曲第一个
可获得舞伴的人。

 总结

这篇博客中我大致介绍了栈和队列的定义,基本概念和实际应用的例子。栈和队列总结一下就是,栈是遵循后进先出原则的线性表,队列是遵循先进先出原则的线性表。在解决实际问题时,如果这个问题具有先进后出或者后进先出的特点,例如括号匹配和舞伴配对等,我们就可以使用栈或者队列来解决这个问题。下一篇博客,我们将介绍栈和队列的具体代码实现。

由于最近要c++期末考,这个星期可能没时间更新了,下个星期我再爆肝。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值