数据结构–循环队列[通俗易懂]

数据结构–循环队列[通俗易懂]文章目录顺序存储结构循环队列代码实现注意顺序存储结构所谓顺序存储结构就是用一组地址连续的存储单元依次存放从队头到队尾的元素。声明两个指针rear、front分别用来指示队尾元素的下一位置和队头元素的位置。初始化时rear=front=0,插入新的元素时尾指针加1,元素出队列时队头指针加1。不过这样做有个问题,不论是入队还是出队,队头或队尾指针都是加1,这样做有一个问题,就是元素…

大家好,又见面了,我是你们的朋友全栈君。

顺序存储结构

所谓顺序存储结构就是用一组地址连续的存储单元依次存放从队头到队尾的元素。

声明两个指针rearfront分别用来指示队尾元素的下一位置和队头元素的位置。

初始化时rear = front = 0
,插入新的元素时尾指针加1,元素出队列时队头指针加1。

不过这样做有个问题,不论是入队还是出队,队头或队尾指针都是加1,这样做有一个问题,就是元素出队所空出的空间无法被重新利用了

尽管队列中实际存储的元素个数远远小于存储空间的规模,但是仍不能做入队操作。这种现象称为假上溢

循环队列

循环队列是队列的顺序存储结构的一种实现方式。它通过将顺序队列想象为一个首尾相接的圆环,来克服假上溢的问题。

image

循环队列中无法通过头尾指针相同来判断队列的状态究竟为空还是满,因为这种情况下可能为空也可能为满

循环队列中通过少用一个元素的空间,以“头指针在尾指针的下一位置时”作为队列为满的判断标志。

代码实现

#define MAXQSIZE 100 //队列最大长度
typedef struct{
    int *base;  //动态分配存储空间
    int front;  //头指针,若队列不空指向队首元素
    int rear;   //尾指针,指向队尾元素的下一位置
    int queueSize;    
} SqQueue;


bool initQueue(SqQueue &Q, int maxSize){
    Q.base = new int[maxSize];
    if(!Q.base){exit(-1);}
    Q.queueSize = maxSize;
    Q.front = Q.rear = 0;
    return true;
}

bool enQueue(SqQueue &Q, int e){
    if((Q.rear + 1) % Q.queueSize == Q.front){
        return false;
    }
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % Q.queueSize;
    return true;
}

bool deQueue(SqQueue &Q, int &e){
    if(Q.front == Q.rear){
        return false;
    }
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % Q.queueSize;
    return true;
}

注意

  1. 如果rear = front,则可以判断队列为空
  2. 如果(rear + 1) % size == front,则可判断队列已满
  3. (rear - front + size) % size为队列长度
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137178.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Spring Boot 中使用 @Transactional 注解配置事务管理

    Spring Boot 中使用 @Transactional 注解配置事务管理事务管理是应用系统开发中必不可少的一部分。Spring为事务管理提供了丰富的功能支持。Spring事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染,因此在实际使用中声明式事务用的比较多。

    2022年6月6日
    110
  • 使用控件的RenderControl()方法导出Excel「建议收藏」

    使用控件的RenderControl()方法导出Excel「建议收藏」使用控件的RenderControl()方法生成HTML表格       stringstrName=”HuaMingCe”;       Response.Clear();       Response.Buffer=true;       Response.Charset=”utf-8″;       Response.AppendHeader(“Content

    2022年7月20日
    13
  • 共射极放大电路和共基极放大电路_如何判断放大电路是共集还是共射

    共射极放大电路和共基极放大电路_如何判断放大电路是共集还是共射如何区分共射极放大电路与共基极放大电路?_百度知道如何区分共射极放大电路与共基极放大电路?_百度知道答有简单的方法:观察信号的输入端和输出端,就看信号正极。共射电路:信号从基极进入,从集电极

    2022年8月3日
    9
  • 多线程面试题(值得收藏)「建议收藏」

    多线程面试题(值得收藏)「建议收藏」史上最强多线程面试47题(含答案),建议收藏金九银十快到了,即将进入找工作的高峰期,最新整理的最全多线程并发面试47题和答案总结,希望对想进BAT的同学有帮助,由于篇幅较长,建议收藏后细看~1、并发编程三要素?1)原子性原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。2)可见性可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修…

    2022年6月6日
    30
  • 数字电路实验 01 – | TTL门电路的逻辑功能测试「建议收藏」

    数字电路实验 01 – | TTL门电路的逻辑功能测试「建议收藏」一、实验目的和任务测试TTL集成芯片中的与门、或门、非门、与非门、或非门与异或门的逻辑功能。 了解测试的方法与测试的原理。二、实验原理介绍实验中用到的基本门电路的符号为:在测试芯片逻辑功能时输入端用逻辑电平输出单元输入高低电平,然后使用逻辑电平显示单元显示输出的逻辑功能。三、实验数据、计算及分析…

    2022年7月15日
    13
  • SSAS介绍

    SSAS介绍文章提纲 商业智能 BI BusinessInte 基本概念 SSAS SQLServerAna 相关工具 开发 管理和客户端 总结 一 商业智能 BI BusinessInte 基本概念商业智能的概念在 1996 年最早由加特纳集团 GartnerGroup 提出 加特纳集团将商业智能定义为 商业智能描述了一系列的概念和方法 通过应用基于事实的支持系统来辅助商业决策的制定 商业智能技术提供使企业

    2025年10月2日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号