数据结构与算法学习笔记(第三章 栈与队列)(2)队列

本文详细介绍了数据结构中的循环队列,包括其在脱机打印输出、多用户系统等场景的应用。阐述了顺序队列的概念,分析了上溢和下溢的情况,并提出循环队列来解决假上溢问题。通过循环队列的表示方法和算法,解释了如何判断队列的空与满,并提供了初始化、入队、出队的实现细节。此外,还对比讨论了链队列的特性与操作方法。

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

队列

常见应用

  • 脱机打印输出:按申请的先后顺序依次输出
  • 多用户系统中多用户排队分时循环使用CPU和主存
  • 按用户的优先级排成多个队,每个优先级一个队列
  • 实时控制系统中,信号按接收的先后顺序一次处理
  • 网络电文传输,按到达的先后顺序依次进行

顺序队

表示

  • 最大队列长度

  • const MAXQSIEZE=100;

  • 或#define MAXQSIZE 100

  • 重定义结构体

    • QElemType *base(顺序队数组的首元素地址)
    • int front;头指针,如果队列不空,指向队头元素front队头元素下标
    • int rear;尾指针,如果队列不空,指向队尾元素再往后一个位置,和栈顶指针一个意思。rear队尾元素下标
    • 注意头尾指针不是真正的指针,是表示下标的int型变量罢了。
      在这里插入图片描述
  • 重定义结构体的新类型名字就叫SqQueue,我们一般SqQueue Q;这样就定义了一个顺序队列。你也可以给队列起别的名字不只是Q,下面采用队列的默认名字Q来说事。

上溢:队列满了,你还往队尾添加元素。那我让rear指针怎么在往上走呢?所以就要报错说上溢了

下溢:队列空了,你还要从队头删除元素,那我让front指针怎么再往下走呢?所以就要报错说下溢了

出队从队头(front指针指的元素)出队,入队从队尾入队(rear指针指的空间入队)

  • 所以会造成假上溢的问题,就是你出队front指针往上走一格,然后入队rear指针也往上走,会不会rear指针都走到头了(数组最后一个元素再往后一格的地址位置),假如你front指针指向了不是下标为0的位置,此时你队列看着还能添加元素,可是你只能从队尾添加,rear指针都到头了,你还添加个屁。所以,这不就是假上溢了吗?

所以就有了循环队列,就是我可以这样解决假上溢问题

  • Q.rear=(Q.rear+1)%MAXQSIZE;这个解决方案很巧妙,假如Q.rear指向了顺序队数组最后一个元素的下标的位置,然后它再+1,是不是就到了上溢的临界点(还没上溢,可能就是队列假满了)?然后比如MAXQSIZE是6,啊,那最后一个元素下标是5,然后5+1再对6取余,这样是不是Q.rear回到了0?这样不就可以在顺序队数组前头添加元素了?解决了假上溢问题
  • front指针也是如此,front指针在顺序队列也会有一次指向了数组最后一个元素下标的位置。然后+1就要到了上溢临界点,然后采取跟Q.rear一样的操作——Q.front=(Q.front+1)%MAXQSIZE;然后就解决了假上溢问题
  • 当然你也可以一个if判断rear/front指针是否指向了队列数组最后一个元素的下一个位置,然后让
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值