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

数据结构–循环队列[通俗易懂]文章目录顺序存储结构循环队列代码实现注意顺序存储结构所谓顺序存储结构就是用一组地址连续的存储单元依次存放从队头到队尾的元素。声明两个指针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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker打开2375「建议收藏」

    docker打开2375「建议收藏」在进行dockerswarm进行管理集群节点时,需要打开端口。1、$pwd/etc/docker创建daemon.json$catdaemon.json{“hosts”:[“tcp://0.0.0.0:2375″,”unix:///var/run/docker.sock”]}2、cat/usr/lib/systemd/system/docker.servic…

    2022年4月29日
    165
  • stm32f103可以驱动摄像头吗?_stm32f103c8t6手册

    stm32f103可以驱动摄像头吗?_stm32f103c8t6手册最近,由于想要做摄像头巡线小车,所以就花了两个星期的时间写了一个OV7725的摄像头驱动。主要器材:鹰眼OV7725摄像头、stm32f103vet6、LCD液晶屏(ILI9341)在这里我不讲解OV7725的工作原理(传输时序、寄存器配置),但是关键还是在OV7725上,详细讲解网上有很多,也可以参考下这篇博客https://www.cnblogs.com/raymon-tec/cate…

    2022年9月23日
    0
  • 调用so库文件以及里面的方法「建议收藏」

    调用so库文件以及里面的方法「建议收藏」之前文章写过一篇JNI生成so库文件 并调用里面的方法手把手教你—JNI的实现实际开发中 so库是别人给你的,不是你自己写的没所以就要用别人的so库文件。有很多情况,有一种是比较简单的:既有so库文件又有对应的jar包,这样的话 直接就可以调用里面的方法了。第二种比较坑爹,限制也比较多,所以现在就主要研究一下第二种吧(只有so库 其他什么都没有)第一

    2022年6月16日
    37
  • apache tomcat 闪退[通俗易懂]

    apache tomcat 闪退[通俗易懂]网上介绍了很多解决办法,下面是我自己的解决办法:1. 我的apache-tomcat是解压缩版(解压了后配置一下就可以用)。 路径:D:\apache-tomcat-8.0.5\ 2. 找到conf文件夹,打开server.xml文件,下拉右手边的滚动条至最下面。 3. 查看上面有没有配置。 4. 我原来有个项目在这个位置配置过,删除后,再运行就没有再出现闪退的

    2022年5月7日
    91
  • Framework7 Vue 教程 入门 学习

    Framework7 Vue 教程 入门 学习网上关于Framework7的博客、学习资料少之又少,所以我想把我学习Framework7Vue的入门记录一下。Framework7Framework7是一个开源免费的框架可以用来开发混合移动应用(原生和HTML混合)或者开发iOS&Android风格的WEBAPP。也可以用来作为原型开发工具,可以迅速创建一个应用的原型。Framework7最主要的功能是可以…

    2022年6月3日
    190
  • 基于Python编程实现简单网络爬虫实现

    基于Python编程实现简单网络爬虫实现编写一个非常轻量的python代码,实现网络爬虫

    2022年5月18日
    37

发表回复

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

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