【数据结构】--队列之循环队列
队列:
- 一种访问受限的线性表,只能在一端进行插入,另一端删除
- 先进先出(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
【数据结构】--队列之循环队列相关推荐
- 数据结构之——队列与循环队列
数据结构学习之--队列与循环队列 什么是队列(Queue) 队列基于动态数组的实现及时间复杂度分析 优化队列 循环队列(LoopQueue) 什么是队列(Queue) 队列(Queue)同栈(stac ...
- 数据结构与算法 | 循环队列
循环队列 实际中我们还会用到一种队列叫做循环队列,这种队列把存储空间前后连接起来,形成像环一样的结构,解决了内存空间浪费的问题 这里我们用顺序结构来实现,因为为了防止溢出的情况,这里我们需要多开一个数 ...
- 《恋上数据结构第1季》队列、双端队列、循环队列、循环双端队列
队列(Queue) 队列 Queue 队列的接口设计 队列源码 双端队列 Deque 双端队列接口设计 双端队列源码 循环队列 Circle Queue 循环队列实现 索引映射封装 循环队列 – %运 ...
- java循环队列_Java版-数据结构-队列(循环队列)
前情回顾 在上一篇,笔者给大家介绍了数组队列,并且在文末提出了数组队列实现上的劣势,以及带来的性能问题(因为数组队列,在出队的时候,我们往往要将数组中的元素往前挪动一个位置,这个动作的时间复杂度O(n ...
- 三星手机电池循环清零代码_数据结构(C语言)-循环队列基本操作
队列是一种先进先出(first in first out,FIFO)的线性表,是一种常用的数据结构. 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列 ...
- 数据结构(8)----栈与队列之循环队列
循环队列的使用 循环队列顺序存储结构 #define MAXSIZE 100 typedef int QElemType; typedef struct SqQueue{QElemType data[ ...
- 数据结构-队列之循环队列
将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上看成一个环,称为循环队列. 当队首指针q.front=MaxSize-1后,再前进一个位置就自动归0,可以通过除法取余运算(%)来实现. 初 ...
- 数据结构 - 队列 环形队列(循环队列)
文章目录 队列介绍 数组模拟队列设计思路 数组模拟队列代码实现 环形队列相关知识说明 队列长度公式推导 数组模拟环形队列代码实现 队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出 ...
- C/C++队列与循环队列
C/C++数据结构 - 队列 循环队列 快速入门 介绍 1. 队列的定义 队列是一种线性存储结构,每次对队列的增删操作如下 增:在队列尾部添加元素 删(取出):在队列头部删除元素 这种数据存储方式遵循 ...
- 队列之循环队列详解(C语言版)
文章目录 前言 一.循环队列的定义 二.循环队列的结构 三.循环队列的常用操作 结语 附录 前言 大家好,越努力,越幸运.本篇文章小猿将跟您分享数据结构队列中的循环队列,希望对您有所帮助. 一.循环队 ...
最新文章
- rsa证书ssh登陆服务器
- 一步一步玩控件:自定义TabControl——从山寨Safari开始
- 黑马程序员——OC语言基本语法知识(一)
- tableau certificate
- PyTorch 官方教程发布,限时免费开放!
- How to Build Your Own Blockchain Part 4.2 — Ethereum Proof of Work Difficulty Explained
- 静态路由与动态路由概念及实例
- adb错误 - INSTALL_FAILED_NO_MATCHING_ABIS
- 中小学招生强化就近入学;首次全女性太空行走取消;苹果付费新闻APP奔溃;NASA火星上发现鹅卵石;这就是今天的大新闻...
- 【收藏】ASP.NET英文技术文章推荐[10/28 – 11/3]
- hdu 4417 树状数组查询区间不是1到n时需要转换,例[0,5]变成[1,6]
- JVM 怎么判断对象已经死了?
- 数字电子技术课程设计用单片机实现数字电子钟
- 雷电模拟器android4.2,雷电安卓模拟器-雷电模拟器下载 v4.0.55.0官方版--pc6下载站...
- Python函数练习题
- cad批量逐个填充lisp,效率提高之CAD如何自动批量导出文本
- 有关人、社会的本质的思考--现代的捕蛇者说
- [code] PTA 胡凡算法笔记 DAY003
- leveldb之arena
- SCI和EI期刊会议知识导航