数据结构之栈和队列

这篇具有很好参考价值的文章主要介绍了数据结构之栈和队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  线性结构是一种基本的数据结构,主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。线性结构的特点是数据元素之间呈现一种线性关系,即元素“一个接一个排列”。
  栈和队列是程序中常用的两种数据结构,它们的逻辑结构和线性表相同。其特点在于运算有所限制:栈按“后进先出”的规则进行操作,队列按“先进先出”的规则进行操作,故称为运算受限的线性表。

1、栈

1.1、栈的定义及基本运算

  (1)栈的定义
  栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。因此,栈又称为后进先出 (Last In First Out,LIFO)的线性表。在栈中进行插入和删除操作的一端称为栈顶 (Top),相应地,另一端称为栈底(Bottom)。不含数据元素的栈称为空栈。
  (2) 栈的基本运算
  ① 初始化栈 InitStack(S):创建一个空栈 S。
  ② 判栈空isEmpty(S):当 S 为空时返回“真”,否则返回“假”。
  ③ 入栈 Push(S,x): 将元素x加入栈顶,并更新栈顶指针。
  ④ 出栈 Pop(S): 将栈顶元素从中删除,并更新栈顶指针。若需要得到栈顶元素的值,可将 Pop(S)定义为一个返回栈顶元素值的函数。
  ⑤ 读栈顶元素 Top(S): 返回栈顶元素的值,但不修改栈顶指针。
  在应用中常使用上述 5 种基本运算实现基于栈结构的问题求解

1.2、栈的存储结构

  (1)顺序存储。栈的顺序存储是指用一组地址连续的存储单元依次存储自栈顶到栈底的数据元素,同时附设指针 top 指示栈顶元素的位置。采用顺序存储结构的栈也称为顺序栈。在这种存储方式下,需要预先定义(或申请) 栈的存储空间,也就是说,栈空间的容量是有限的。因此,在顺序栈中,当一个元素入栈时,需要判断是否栈满(栈空间中没有空闲单元),若栈满,则元素不能入栈。
  (2)栈的链式存储。用链表作为存储结构的栈也称为链栈。由于栈中元素的插入和删除仅在栈顶一端进行,因此不必另外设置头指针,链表的头指针就是栈顶指针。链栈的表示如下图所示。数据结构之栈和队列,数据结构,数据结构

  (3) 栈的应用。栈的典型应用包括表达式求值、括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。

2、队列

2.1、队列的定义及基本运算

  (1)队列的定义。队列是一种先进先出 (First In First Out,FIFO) 的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入元素的一端称为队尾(Rear)。允许删除元素的一端称为队头 (Front)。
  (2)队列的基本运算。
  ① 初始化队列 InitQueue(Q): 创建一个空的队列Q。
  ② 判队空isEmpty(Q): 当队列为空时返回“真”,否则返回“假”。
  ③ 入队 EnQueue(Q,x): 将元素 x 加入到队列Q 的队尾,并更新队尾指针。
  ④ 出队 DelQueue(Q): 将队头元素从队列Q 中删除,并更新队头指针。
  ⑤ 读队头元素 FrontQue(Q): 返回队头元素的值,但不更新队头指针。

2.2、队列的存储结构

  (1)队列的顺序存储。队列的顺序存储结构又称为顺序队列,它也是利用一组地址连续的存储单元存放队列中的元素。由于队列中元素的插入和删除限定在表的两端进行,因此设置队头指针和队尾指针,分别指出当前的队头和队尾。
  下面设顺序队列Q的容量为 6,其队头指针为 front,队尾指针为 rear,头、尾指针和队列中元素之间的关系如下图 所示。
数据结构之栈和队列,数据结构,数据结构

  在顺序队列中,为了降低运算的复杂度,元素入队时只修改队尾指针,元素出队时只修改队头指针。由于顺序队列的存储空间容量是提前设定的,所以队尾指针会有一个上限值,当队尾指针达到该上限时,就不能只通过修改队尾指针来实现新元素的入队操作了。若将顺序队假想成一个环状结构(通过整除取余运算实现),则可维持入队、出队操作运算的简单性,如下图所示,称之为循环队列。
数据结构之栈和队列,数据结构,数据结构

  设循环队列Q的容量为 MAXSIZE,初始时队列为空,且 Q.rear 和 Q.front 都等于 0,如下图 (a) 所示。
  元素入队时,修改队尾指针 Q.rear =(Q.rear+I) % MAXSIZE,如下图 (b) 所示。
  元素出队时,修改队头指针 Q.front =(Q.front+1) % MAXSIZE,如下图(c)所示。
  根据队列操作的定义,当出队操作导致队列变为空时,则有 Q.rear = Q.front,如下图(d)所示;若入队操作导致队列满,则 Q.rear = Q.front,如下图 (e) 所示。
  在队列空和队列满的情况下,循环队列的队头、队尾指针指向的位置是相同的,此时仅仅根据 Q.rear和 Q.front之间的关系无法断定队列的状态。为了区别队空和队满的情况,可采用以下两种处理方式:其一是设置一个标志,以区别头、尾指针的值相同时队列是空还是满;其二是牺牲一个存储单元,约定以“队列的尾指针所指位置的下一个位置是队头指针时”表示队列满,如下图(f) 所示,而头、尾指针的值相同时表示队列为空。
数据结构之栈和队列,数据结构,数据结构

  设队列中的元素类型为整型,则循环队列的类型定义如下:

#define MAXOSIZE 100
typedef struct
	int *base;		/*循环队列的存储空间,假设队列中存放的是整型数*/
	int front;		/*指示队头,称为队头指针*/
	int rear;		/*指示队尾,称为队尾指针*/
)SqQueue;

  【函数】创建一个空的循环队列。

int InitQueue(SqOueue *Q)
/*创建容量为MAXOSIZE 的空队列,若成功返回0,否则返回-1*/
{
	Q -> base = (int*)malloc(MAXQSIZE*sizeof(int));
	if (!Q->base) return -1;
	Q->front = 0: 0->rear = 0, return 0;
}/*InitQueue*/

  【函数】元素入循环队列。

intEnQueue(SqQueue *Q, int e)	/*元素e入队,若成功返回0,否则返回-l*/
{
	if((O->rear+1) % MAXOSIZE == Q->front) return-1;
	Q->base[Q->rear] = e;
	Q->rear = (Q->rear+1) % MAXOSIZE;
	return 0;
}/*EnQueue*/

  【函数】元素出循环队列。

int DelOueue(SqOueue *Q, int *e)
/*若队列不空,则删除队头元素,由参数e带回其值并返回0,否则返回-1*/
{
	if( Q->rear == Q->front) return-1;
	*e = Q->base[Q->front];
	Q->front = (Q->front+1) % MAXQSIZE;
	return 0;
}/*DelQueue*/

  (2)队列的链式存储。队列的链式存储也称为链队列。这里为了便于操作,给链队列添加一个头结点,并令头指针指向头结点。因此,队列为空的判定条件是头指针和尾指针的值相同,且均指向头结点。队列的一种链式存储如下图所示。
数据结构之栈和队列,数据结构,数据结构

2.3、队列的应用

  队列结构常用于处理需要排队的场合,例如操作系统中处理打印任务的打印队列、离散事件的计算机模拟等。文章来源地址https://www.toymoban.com/news/detail-813653.html

到了这里,关于数据结构之栈和队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高效学习数据结构之栈和队列篇(五千字超详细教程)

    大家好呀我是小生🙉🙊🙈今天我们来学习 数据结构的栈和队列 ,小生为了方便大家理解特意附上了 许多图片和源码 一起加油吧 🥳🥳🥳   下面是我们今天要学习的内容 🥳🥳🥳  一.栈          1.🏠栈的基本概念 ​2.🏠栈的结构选择 🚀顺序表和链表的优缺点对比:

    2023年04月08日
    浏览(56)
  • 数据结构之栈和队列 - 超详细的教程,手把手教你认识并运用栈和队列

    栈:后进先出 队列:先进先出 栈:是一种特殊的 线性表 , 只允许在固定的一端插入或者删除元素 ,一个栈包含了栈顶和栈底。只能在栈顶插入或者删除元素。 栈的底层 是由 数组 实现的。 栈遵循先入后出原则,也就是先插入的元素得到后面才能删除,后面插入的元素比

    2024年02月07日
    浏览(43)
  • 《数据结构》之栈和堆结构及JVM简析

    在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代? 作为一个程序猿,我们应该会常常跟代码打交道,那么我们所编写的程序或代码

    2024年02月07日
    浏览(38)
  • 【数据结构】线性表之栈、队列

    前面两篇文章讲述了关于线性表中的顺序表与链表,这篇文章继续讲述线性表中的 栈和队列。 这里讲述的两种线性表与前面的线性表不同,只允许在一端入数据,一段出数据,详细内容请看下面的文章。 顺序表与链表两篇文章的链接: 线性表之顺序表 线性表之链表 注意:

    2024年02月06日
    浏览(41)
  • 数据结构之栈、队列——算法与数据结构入门笔记(四)

    本文是算法与数据结构的学习笔记第四篇,将持续更新,欢迎小伙伴们阅读学习 。有不懂的或错误的地方,欢迎交流 栈是一种线性数据结构,其 只允许在固定的一端进行插入和删除 元素操作。进行数据插入和删除操作的一端称为栈顶 (Top), 另一端称为栈底 (Bottom)。栈中的

    2024年02月08日
    浏览(29)
  • 数据结构之栈与队列详解

    栈和队列是一种特殊的线性结构,他与之前学的线性结构不同,栈和队列是拥有一种特殊规则的线性结构,虽然它是用数组或者链表实现,但是只有符合这种规则才能被称作栈或者队列 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和

    2024年01月16日
    浏览(34)
  • Java------数据结构之栈与队列(简单讲解)

    本篇碎碎念 :时隔n个月,继续写博客,假期落下的进度,在开学后努力追赶, 假期不努力,开学徒伤悲啊,此时此刻真想对自己说一句,活该啊~~~~ 欠下的链表练习题讲解会在下次更新~~~~ 今日份励志文案:  万物皆有裂痕,那是光照进来的地方 栈:一种特殊的线性表,其只允

    2024年04月14日
    浏览(48)
  • 数据结构之栈与队列的实现与详细解析

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题       数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.栈 2.1栈的概念与性质 2.2栈的实现 3.队列 3.1队列的概

    2024年02月05日
    浏览(35)
  • Java 数据结构之栈、队列(头歌平台,详细注释)

    目录 第1关:实现基于数组的 任务描述 相关知识 栈 栈的数组表示 Java 泛型简介 泛型方法 泛型类应用场景示例 代码:  第2关:实现基于链表的栈 任务描述 相关知识 栈的链式存储 入栈 出栈 代码:  第3关:基于数组的队列 任务描述 相关知识 队列 队列的数组实现 循环队列

    2024年04月25日
    浏览(30)
  • 【数据结构】栈和队列(队列篇)

    上期我们已经学习了数据结构中的栈,这期我们开始学习队列。 目录 1.队列的概念及结构 2.队列的实现 队列结构体定义 常用接口函数 初始化队列 队尾入队列 队头出队列 获取队列头部元素、 获取队列队尾元素 获取队列中有效元素个数 检测队列是否为空 销毁队列 3.循环队

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包