队列:

  • 一种访问受限的线性表,只能在一端进行插入,另一端删除
  • 先进先出(FIFO),队尾插入,队头删除

队列的分类:顺序队列、链表队列

顺序队列:底层的数据结构是内存连续的,基于数组实现队列的先进先出

队头为0,队尾为4的删除数据的时间复杂度为o(n),太高,因此我们一般不用,为了减低时间复杂度,我们一般使用循环队列来处理顺序队列,也就是在逻辑上将数组变成一个环。

循环队列:以数组的形式模拟出环状结构,front是队头指针,队头(第一个)元素的下标;rear是队尾指针,最后一个元素的下一个下标

注意:因为是环形设计,所以往后走不能直接++,容易越界,应该为front=(front+1)%size,rear=(rear+1)%size

插入的操作:头指针front和尾指针rear开始同时指向0下标,每插入一个元素,rear向后移动一个下标;arr[rear]=xx;没有循环,时                       间复杂度为o(1);

注意:当rear指向最后一个5下标时,因为不能从5直接指向0,所以不能使用rear++,必须使用                                                                 rear=(rear+1)%MAX_SIZE;eg: rear=(rear+1)%6;rear=(5+1)%6=0(rear是数组的下标);%为取余

删除的操作:每删除一个数据,front向后移动一个下标;front++;只删除元素,不移动数据;时间复杂度为o(1);

判空和判满:因为front==rear既可以判空也可以判满,所以不能用此方法,这时,我们需要牺牲一个内存单元,每次满的时候会                         选择牺牲front之前的内存单元;(牺牲的内存单元不固定,每次轮番牺牲)

判空empty:rear==front

判满full:(rear+1)%6==front

代码实现:

结构设计:

typedefn int ElemType;
#define MAX_SIZE 9;typedef struct Queue
{ElemType arr[MAX_SIZE];//数组arr[10]int front;//队头指针int rear;//队尾指针
}Queue,pQueue;

初始化:

void init(pQueue pqu)
{if(pqu!=NULL){pqu->frpnt=pqu->rear=0;}
}

入队:

(1)判满

int full(pQueue pue)//1 full,0 not full
{return (pqu->rear+1)%MAX_SIZE==pqu->front ?1:0;
} 

(2)

int enqueue(pQueue pqu,ElemType val)//1 success,0 fail
{if(full(que)){return 0;}pqu->arr[pqu->rear]=val;pqu->rear=(pqu->rear+1)%MAX_SIZE;return 1;
}

出队:

(1)判空

int empty(pQueue pue)//1 empty,0 not empty
{return pqu->rear==pqu->front ? 1:0;
}

(2)

int dequeue(pQueue pue)//单纯的删除元素,没有存储
{if(empty(pue)){return 0;}pqu->front=(pqu->front+1)%MAX_SIZE;//向前走一个return 1;
}

获取队头元素:

int front(pQueue pqu)
{if(empty(pqu)){throw std::exception("queue is empty!");//一般使用c++处理机制,抛出异常//return -1;//-1有两种情况,数值为-1或者队列为空,因此是异常的,一般不建议这样使用}return pqu->arr[pqu->front];
}

获取队尾元素:

int back(pQueue pqu)
{if(empty(pqu)){throw std::exception("queue is empty!");//#include<iostream>c++头文件// return -1;//-1代表队列为空}return pqu->arr[(pqu->rear+MAX_SIZE-1)%MAX_SIZE];//回退一个,通过rear获取上一个元素为队尾元素
}

函数的实现:

int main()
{Queue que;init(&que);for(int i=0;i<8;i++){enqueue(&que,i);}int rtfront=front(&que);int reback=back(&que);printf("front:%d\n",rtfront);printf("back:%d\n",rtback);dequeue(&que);enqueue(&que,100);rtfront=front(&que);reback=back(&que);return 0;
}

考题:

1、为什么设计成环形?

因为其他方法复杂度太高,而环形入队出队时间复杂度都为O(1),速度快

2、为什么要空一个格子?

判断为空:front==rear

判断为满:设计时最后一个格子不使用,rear再往后走一步front这时就满,浪费一个单元格

因为front==rear既可以判空也可以判满,所以不能用此方法,这时,我们需要牺牲一个内存单元,每次满的时候会选择牺牲front之前的内存单元;(牺牲的内存单元不固定,每次轮番牺牲)

3、因为是环形设计,所以往后走不能直接++,容易越界,应该为front=(front+1)%size,rear=(rear+1)%size

【数据结构】--队列之循环队列相关推荐

  1. 数据结构之——队列与循环队列

    数据结构学习之--队列与循环队列 什么是队列(Queue) 队列基于动态数组的实现及时间复杂度分析 优化队列 循环队列(LoopQueue) 什么是队列(Queue) 队列(Queue)同栈(stac ...

  2. 数据结构与算法 | 循环队列

    循环队列 实际中我们还会用到一种队列叫做循环队列,这种队列把存储空间前后连接起来,形成像环一样的结构,解决了内存空间浪费的问题 这里我们用顺序结构来实现,因为为了防止溢出的情况,这里我们需要多开一个数 ...

  3. 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列

    队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...

  4. java循环队列_Java版-数据结构-队列(循环队列)

    前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...

  5. 三星手机电池循环清零代码_数据结构(C语言)-循环队列基本操作

    队列是一种先进先出(first in first out,FIFO)的线性表,是一种常用的数据结构. 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列 ...

  6. 数据结构(8)----栈与队列之循环队列

    循环队列的使用 循环队列顺序存储结构 #define MAXSIZE 100 typedef int QElemType; typedef struct SqQueue{QElemType data[ ...

  7. 数据结构-队列之循环队列

    将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上看成一个环,称为循环队列. 当队首指针q.front=MaxSize-1后,再前进一个位置就自动归0,可以通过除法取余运算(%)来实现. 初 ...

  8. 数据结构 - 队列 环形队列(循环队列)

    文章目录 队列介绍 数组模拟队列设计思路 数组模拟队列代码实现 环形队列相关知识说明 队列长度公式推导 数组模拟环形队列代码实现 队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出 ...

  9. C/C++队列与循环队列

    C/C++数据结构 - 队列 循环队列 快速入门 介绍 1. 队列的定义 队列是一种线性存储结构,每次对队列的增删操作如下 增:在队列尾部添加元素 删(取出):在队列头部删除元素 这种数据存储方式遵循 ...

  10. 队列之循环队列详解(C语言版)

    文章目录 前言 一.循环队列的定义 二.循环队列的结构 三.循环队列的常用操作 结语 附录 前言 大家好,越努力,越幸运.本篇文章小猿将跟您分享数据结构队列中的循环队列,希望对您有所帮助. 一.循环队 ...

最新文章

  1. rsa证书ssh登陆服务器
  2. 一步一步玩控件:自定义TabControl——从山寨Safari开始
  3. 黑马程序员——OC语言基本语法知识(一)
  4. tableau certificate
  5. PyTorch 官方教程发布,限时免费开放!
  6. How to Build Your Own Blockchain Part 4.2 — Ethereum Proof of Work Difficulty Explained
  7. 静态路由与动态路由概念及实例
  8. adb错误 - INSTALL_FAILED_NO_MATCHING_ABIS
  9. 中小学招生强化就近入学;首次全女性太空行走取消;苹果付费新闻APP奔溃;NASA火星上发现鹅卵石;这就是今天的大新闻...
  10. 【收藏】ASP.NET英文技术文章推荐[10/28 – 11/3]
  11. hdu 4417 树状数组查询区间不是1到n时需要转换,例[0,5]变成[1,6]
  12. JVM 怎么判断对象已经死了?
  13. 数字电子技术课程设计用单片机实现数字电子钟
  14. 雷电模拟器android4.2,雷电安卓模拟器-雷电模拟器下载 v4.0.55.0官方版--pc6下载站...
  15. Python函数练习题
  16. cad批量逐个填充lisp,效率提高之CAD如何自动批量导出文本
  17. 有关人、社会的本质的思考--现代的捕蛇者说
  18. [code] PTA 胡凡算法笔记 DAY003
  19. leveldb之arena
  20. SCI和EI期刊会议知识导航

热门文章

  1. 3d模型导入MAYA常见错误!
  2. 被“需要”的无功功率
  3. 【官方文档】Fluent Bit 1.8 官方文档
  4. 关于pc手机端自适应开发的一些记录
  5. 一度智信:拼多多商家上架商品指南分享
  6. 深大uooc学术道德与学术规范教育第七章
  7. 【\u20a 错误解决】
  8. 2022谈谈手机充电头/快充头/电源适配器
  9. c++ Bellman-Ford 算法
  10. 前端理解base64