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

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

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

顺序存储结构

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

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

初始化时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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • kfold交叉验证_SPSS交叉验证法

    kfold交叉验证_SPSS交叉验证法一、前言在机器学习建模过程中,通行的做法是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证(Validation)数据,用来评估模型的训练效果。验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训

    2022年9月20日
  • 靠!我被项目经理和同事嘲笑了,因为不会远程debug调试…「建议收藏」

    大家好,我是曹尼玛,刚从培训机构毕业,去一家单位上班一周了…这一周项目经理让我熟悉了项目业务,架构和设计,不算难,凭借我培训机构第一名的成绩,还是很顺溜。今天项目经理把同事们叫到一起,说线上438×6项目出现奇葩问题,但是开发环境初步测试没问题,需要配合测试部的小姐姐们在测试环境远程debug跟踪下,排查下问题,以及正式环境日志也会提供,重现下问题,解决下bug;项目经理见我这几天比较悠闲所以就对我说,“曹尼玛,这个小任务就交给你了”“我,我,我,我不会远程debug,没听过什么是远程d.

    2022年4月6日
  • UpdatePanel嵌套

    UpdatePanel嵌套UpdatePanel主要是防止页面的刷新,但是项目中有时候可能要根据不同的事件更新不同的地方。 这时候UpdatePanel嵌套可以很好的解决这个问题。 在事例中主要是用时间来记录每个UpdatePanel的刷新。 前台代码: UpdatePanel嵌套

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