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

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


相关推荐

  • 学计算机的男生喜欢什么样的女生,男生喜欢女生的九种表现 男生对女生说的甜蜜情话…

    学计算机的男生喜欢什么样的女生,男生喜欢女生的九种表现 男生对女生说的甜蜜情话…1、你那些恶作剧我是故意中招的,因为想看见你的笑颜。2、推我一把叫我加油的,抱着我让我“不用硬撑也可以”的都是你。3、跟着我,不喜欢吗?如果不喜欢那我就跟着你走。4、如果你在天堂遇见我,请装作不认识我的样子,因为下一次也想由我向你求婚。5、手机里依然留着喜欢你那句未曾送出的信息。6、电话里吵了架,即使如此却还想见你,正因如此才想见你。7、妻啊,虽然开不了口说爱,但不准比我先死。8、短信来了。你问我…

    2022年7月25日
    23
  • 使SplitContainer中某个Panel宽度、高度不变[通俗易懂]

    使SplitContainer中某个Panel宽度、高度不变[通俗易懂]1.在窗体load时加入:splitContainer_AllLayout.SplitterDistance=120;上边代码字面意思是将水平、或垂直分开的SplitContainer的分区长度设置为1202.只要设置FixedPanel属性为希望宽度不变的panel即可:3.再设置控件不可拖动:splitContainer_AllLayout.IsSplitter…

    2022年7月18日
    20
  • 使用cookie登录

    前言:什么是cookie?Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。那么我们可以利用Urllib库保存我们登录的Cookie,然后再抓取其他页面,这样就达到了我们的目的。一、Urllib库简介Urllib是python内置的H…

    2022年4月7日
    182
  • pycharm2021.3.2激活码3月最新在线激活「建议收藏」

    pycharm2021.3.2激活码3月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    333
  • linux连接Redis客户端

    linux连接Redis客户端linux命令下载redis-stable#官网下载,这里使用wget直接下载的[linux]$wgethttp://download.redis.io/redis-stable.tar.gz#解压[linux]$tar-xzvfredis-stable.tar.gz#进入解压目录[linux]$cdredis-stable#编译[linux]$make#拷贝入bin目录[linux]$cpsrc/redis-cli/usr/local/bin/验证redi

    2022年5月5日
    58
  • navicat15激活码最新_通用破解码

    navicat15激活码最新_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    80

发表回复

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

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