队列的顺序数组c语言代码,队列-队列的顺序表示和实现

队列-队列的顺序表示和实现

和顺序栈相类似,在利用顺序分配存储结构实现队列时,除了用一维数组描述队列中数据元素的存储区域之外,尚需设立两个指针front和rear分别指示“队头”和“队尾”的位置。

为了在C语言中描述方便,在此我们约定:初始化建空队列时,令front=rear=0。每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。因此,在非空队列中,头指针始终指向队列头元素位置,队尾指针始终指向队列尾元素的下一个位置。如图所示:

b0e05d504f72e295b2e7022349499351.gif

从图中可以看到,随着入队出队的进行,会使整个队列整体向后移动,这样就出现了循环队列操作示意图(d)中的现象(假溢出现象):队尾指针已经移到了最后,再有元素入队就会出现溢出,而事实上此时队中并未真的“满员”,这种现象为“假溢出”,这是由于“队尾入队头出”这种受限制的操作所造成。解决假溢出的方法之一是将队列看成头尾相接的循环结构,头尾指针的关系不变,将其称为“循环队列”,“循环队列”的示意图如下图所示:

fd1c0a5d0d2762d4ae73fa073b87a539.gif

因为是头尾相接的循环结构,

入队时的队尾指针加1操作修改为:q.rear=(q.rear+1) % MAXSIZE;

出队时的队头指针加1操作修改为:q.front=(q.front+1) % MAXSIZE;

设MAXSIZE=10,下图是循环队列操作示意图。

1d9822ec6ac269a67c78c8f600806ee7.gif

如上图所示的循环队可以看出,(a)中具有a5、a6、a7、a8四个元素,此时front=5,rear=9;随着a9~a14相继入队,队中具有了10个元素--队满,此时front=5,rear=5,如(b)所示,可见在队满情况下有:front==rear。若在(a)情况下,a5~a8相继出队,此时队空,front=9,rear=9,如(c)所示,即在队空情况下也有:front==rear。就是说“队满”和“队空”的条件是相同的了。这显然是必须要解决的一个问题。

方法之一是附设一个存储队中元素个数的变量如num,当num==0时队空,当num==MAXSIZE时为队满。

另一种方法是少用一个元素空间,把图(d)所示的情况就视为队满,此时的状态是队尾指针加1就会从后面赶上队头指针,这种情况下队满的条件是:(q->rear+1) % MAXSIZE == q->front,也能和空队区别开。

队列的顺序存储结构

typedef struct {

QElemtype *base;//初始化的动态分配存储空间

int front;//队头指针

int rear;//队尾指针

}SqQueue;

循环队列的实现

下面的循环队列及操作按第二种方法实现。

#include 

#include 

#define MAXSIZE 10

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status;

typedef int QElemtype;

typedef struct {

QElemtype *base;//初始化的动态分配存储空间

int front;//队头指针

int rear;//队尾指针

}SqQueue;//循环队列

//--------------------循环队列的基本操作的算法描述------------------

Status InitQueue(SqQueue *q)

{//构造一个空队列Q

q->base=(QElemtype*)malloc(MAXSIZE*sizeof(QElemtype));

if(!q->base)exit(OVERFLOW);//存储分配失败

q->front= q->rear =0;

return OK;

}

int queuelength(SqQueue q)

{//返回Q的元素个数,即队列的长度

return (q.rear - q.front + MAXSIZE) % MAXSIZE;

}

Status EnQueue (SqQueue *q,QElemtype e)

{//插入元素e为Q的新的队尾元素

if ((q->rear+1) % MAXSIZE == q->front) return ERROR;//队列满,不进行任何操作,不能再入队

q->base[q->rear]=e;

//入队的操作

q->rear=(q->rear+1) % MAXSIZE;

return OK;

}

Status DeQueue (SqQueue *q,QElemtype *e)

{//若队列不空,则删除Q的对头元素,用e返回其值,并返回OK;否则返回ERROR

if (q->front==q->rear) return ERROR;//队列满

*e=q->base[q->front]; //指针的下标运算

q->front=(q->front+1) % MAXSIZE;

return OK;

}

void display_queue(SqQueue *q){

if(q->front==q->rear){

printf("queue is empty!!\n");

}else {

//遍历该循环队列

int front = q->front;

int rear = q->rear;

while(front!=rear){

printf("%d\n",q->base[front]);

++front;

}

}

}

int main(){

SqQueue q;

InitQueue(&q);

int i;

for(i=0;i<11;i++){

if(EnQueue(&q,i)==ERROR){

printf("循环队列已满,该队列长度为9 \n");

}

}

printf("the length of queue is %d \n",queuelength(q)); //the length of queue is 9

int e1,e2,e3,e4,e5;

DeQueue(&q,&e1);

DeQueue(&q,&e2);

DeQueue(&q,&e3);

DeQueue(&q,&e4);

DeQueue(&q,&e5);

printf("%d--%d--%d--%d--%d \n",e1,e2,e3,e4,e5);

printf("the length of queue is %d \n",queuelength(q));

printf("循环队列的遍历\n");

display_queue(&q);

int e6;

DeQueue(&q,&e6);

printf("循环队列的遍历\n");

display_queue(&q);

system("pause");

return 0;

}

运行结果:

循环队列已满,该队列长度为9

循环队列已满,该队列长度为9

the length of queue is 9

0--1--2--3--4

the length of queue is 4

循环队列的遍历

5

6

7

8

循环队列的遍历

6

7

8

请按任意键继续. . .

注:数学中的余数其实就是取模运算

如,m模n (c语言表示 m%n )

x mod y = x % y

数学中的余数概念和我们的计算机中的余数概念一致,但实现却不一致。

========END========

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 链接分享到朋友圈,android 分享到微信朋友圈或微信好友

一、首先创建一个数字签名(keystore文件)这里不再讲述keystore的创建过程&#xff01;二、用keystore给app签名&#xff0c;注意最后如下图所示图中的md5就是 申请apkid时所需的 签名&#xff0c;这里需要注意MD5需要将其中的“&#xff1a;”去掉并将其中的大写字母改为小写三…

android studio开源代码,Android Studio Set of source 代码源集

一、源集1、定义&#xff1a;Android Studio 按逻辑关系将每个模块的源代码和资源进行分组&#xff0c;这个分组叫做源集。2、main Module 源集包括其所有构建变体共用的代码和资源。这句话很关键&#xff0c;意思是&#xff0c;所有的其他构建变体&#xff0c;src/main是其共同…

android nougat和安卓7.1,Android Nougat 7.1.2 先睹为快

Android Nougat 的下一个维护版本 7.1.2 即将发布&#xff01;为了让广大开发者有机会抢先尝鲜&#xff0c;我们从今天开始向已注册 Android Beta 计划、符合条件的设备(包括 Pixel 和 Pixel XL、Nexus 5X、Nexus Player 和 Pixel C 设备)推出公众测试版本。我们还在准备 Nexus…

android app 移植到pc,微软开发新应用把Android app“移植”到Win Phone

依据微软2010年公布在Tweet上的一份专利申请书&#xff0c;微软正在开发一种新服务能够在不同的手机操作系统中“移植”应用和应用数据。这是说Android&#xff0c;iOS应用以后可以跨平台“移植”到 Win Phone Win8系统上&#xff1f;因为Win Phone 著名的“应用问题”&#xf…

鸿蒙系统能否推广,鸿蒙系统凭实力占市场,无需通过禁止安卓系统来推广

有人提议中国应该全面禁用安卓系统&#xff0c;以推广鸿蒙系统(HarmonyOS)&#xff0c;甚至还给出了比如安全等理由。确实有这个必要吗&#xff1f;答案是否定的。一、安卓系统是开源系统&#xff0c;不存在被谷歌完全操控而影响到中国安全的问题。实际上安卓系统诸如碎片化、应…

android ut接口介绍,CMCC UT接口(IMS SS)规范说明

OverviewCMCC 关于 UT 部分的说明及规范请参考 "中国移动VoLTE终端技术规范" 中的第6节说明.写在前面: 由于 CMCC 的XCAP server(UT) 和 CS Server(HLR)暂不支持 SS 业务配置SYNC. 因此, 针对支持 UT 的卡, 以及所在城市提供 UT 服务, 则如果某项 SS 业务不支持通过 …

五年级信息技术上册教案计算机主机探秘,第1课信息与信息技术探秘教案

第1课信息与信息技术探秘教案&#xff3b;教学目标&#xff3d;1、知识与技能(1)了解什么是信息、信息传递和信息处理的基本知识。(2)了解信息技术及其应用、发展的基本情况。(3)了解计算机在信息处理中的作用和地位。2、过程与方法以直观的手段让学生初步了解信息和信息技术。…

pc端html轮播带滑块,swiper.js简单快速实现轮播滑动(兼容PC端、移动端)

swiper是一款免费以及轻量级轮播滑动的js框架&#xff0c;适用于PC端跟移动端&#xff0c;官方地址&#xff1a;(https://www.swiper.com.cn/)效果演示&#xff1a;PC端移动端(在浏览器将设备切换为手机&#xff0c;这里切换为iphone)&#xff0c;swiper支持移动端触控左右滑动…

html木桶布局,木桶布局 实现

百度图片图片来自 百度图片像这样高度一样&#xff0c;而宽度不同的布局方式称之为木桶布局。它有几个鲜明的特点&#xff1a; 每行的图片高度一致&#xff1b;每行的图片都是占满的。如何实现木桶布局 之 整体思路我们需要先拥有一些素材(图片)&#xff0c; 并且将这些图片横向…

如何自己塑封_全球市场三足鼎立,国内半导体封测业如何实现可持续发展?

由于全球半导体市场规模不断增长&#xff0c;终端电子产品需求旺盛&#xff0c;国内半导体封装测试产业迎来了良好的发展机遇。国内半导体封装测试产业如何实现高质量、可持续发展?一时间&#xff0c;半导体封装测试产业再起热议。全球封装测试市场三足鼎立我国半导体封装测试…

博途中用的是c吗_一只“66 鸭”离奇出走,只为助蛋宝宝C位出道

作者 | 欧阳睿 来源 | 4A广告文案对于喜爱蛋黄酥的粉丝来说&#xff0c;一定知道轩妈蛋黄酥&#xff0c;这个在南宁土生土长的蛋黄酥品牌&#xff0c;2015年公司才刚刚成立&#xff0c;如今已坐拥超高人气和口碑&#xff0c;成长为全网类目的TOP1&#xff0c;就连李佳琦也强…

尼奥机器人不能手机绑定_微信绑定的手机号,如果手机号停用,是不是微信也不能用了?...

风水转运算命师未卜先知、指点迷津&#xff0c;助你顺风顺水&#xff01;商务合作qq&#xff1a;2770794800如果小编现在问你&#xff1f;你在干什么&#xff1f;那么是不是很多人都会说&#xff1a;当然是在刷手机了&#xff01;我们现在生活中最经常使用的就是手机了&#xf…

吸顶那个叫什么_为什么我家吸顶灯开灯后一闪一闪的

前不久&#xff0c;笔者看到网络上有网友在问&#xff1a;为什么我家的吸顶灯开灯后一闪一闪的&#xff0c;关灯后闪一会才会灭&#xff01;对于这个问题&#xff0c;笔者发现有好多网友在问。我们给出的方法和原则就是&#xff1a;哪里里坏了换哪里&#xff01; 那么&#xff…

计算机声卡怎么启动不了,三大方法助你解决声卡故障问题!

电脑声卡坏了怎么办?可能大家平时会碰到这个问题&#xff0c;别紧张&#xff0c;电脑声卡故障的原因无非就是那么几个&#xff0c;下面让小编带大家一起分析分析电脑声卡故障的原因以及处理办法。造成电脑声卡故障的原因主要有三种&#xff0c;一是相关服务未开启&#xff0c;…

我的世界服务器自定义欢迎界面,我的世界启动界面如何修改 diy修改启动界面攻略...

来源&#xff1a;网络我的世界怎么修改界面描述如何修改描述&#xff0c;是不是很多小伙伴们都不了解呢&#xff1f;今天Minecraft中文分享站小编就来给大家介绍一下&#xff0c;还不是很清楚相关内容的小伙伴抓紧了&#xff0c;希望这篇攻略对大家有帮助~&#xff01;我的世界…

腾讯云服务器数据盘买多了,腾讯云Windows云服务器数据盘分区和格式化

Windows2008_64位系统手动格式化小于2TB数据盘操作指引新购买的Windows云服务器&#xff0c;数据盘未做分区和格式化&#xff0c;无法使用。请根据以下步骤手动对数据盘进行分区以及格式化。暂不支持对Windows云服务器进行自动格式化。1. 进入数据盘分区界面登录Windows云服务器…

dataset的去重计数 g2_向工程渣土运输车辆计数 漏洞损失说“不”

基建越来越扩张的今天&#xff0c;很多工地还在人工计数管理&#xff0c;漏洞巨大&#xff0c;不远改变思维&#xff0c;总觉得损失一点也没有什么&#xff0c;现在开始逐渐推行智慧工地渣土运输管理&#xff0c;没有跟上步伐的&#xff0c;迟早会被被市场和“甲方爸爸”抛弃&a…

服务器虚拟化底层系统安装,Hyper-V是底层的虚拟机程序,位于操作系统和硬件之间,很薄一层...

今天介绍Hyper-V是底层的虚拟机程序&#xff0c;Windows server 2008 R2如何启动Hyper-V虚拟机。小伙伴们可能不一定了解&#xff0c;Hyper-V是微软的一款虚拟化产品&#xff0c;是微软第一个采用类似VMWare和Citrix Xen一样的基于Hypervisor的技术。通过Hyper-V功能&#xff0…

显示三维图片序列_SLAM结合三维检测

11.11---11.17​ 在此前一周进行yolo与cube slam整合的时候&#xff0c;采用ros通信的方式。存在两个问题&#xff1a;一个是darknet检测不到目标&#xff0c;就不对外发布检测结果&#xff0c;会造成检测结果和图片序列对不上。另一个问题是图片发布给darknet和cube slam的时间…

cc穿盾并发脚本_敢不敢模拟超过 5 万的并发用户?

阅读本文大概需要 6 分钟。来自&#xff1a;http://t.cn/ES7KBkW本文将从负载测试的角度&#xff0c;描述了做一次流畅的 5 万用户并发测试需要做的事情。你可以在本文的结尾部分看到讨论的记录。快速的步骤概要&#xff1a;编写你的脚本使用 JMeter 进行本地测试BlazeMeter 沙…