现有设循环队列为q 1 mq,采用队列中少用一个元素空间的方法来判断队列满。

C语言队列的理解 - nanjoh的博客 - CSDN博客
C语言队列的理解
& &队列是一种特殊的线性表,特殊之处在与允许在表的前端(front)进行删除操作,而在表ide后端进行插入操作,和栈一样,队列时一种操作受限制的线性表,进行
插入操作的端称为队尾,进行删除操作的端称为队头。
& 队列的数据元素称为队列元素,在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队,因为队列只允许在一段插入,一端删除,所以只有最早进入队列
的元素才能从队列中删除,故队列由称为先进先出(fifo)
& 顺序队列
& & &建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理,一个是队头指针front,它指向队头元素,一个是队尾指针rear,它指向下一个入队元素,位置,每次在队尾插入一个元素,rear增加1;每次在队头删除一个元素,front增加1,随着插入和删除的操作进行,队列元素的各数不断变化,队列占的存储空间在队列结构分配的连续空间中移动,当Front=rear时,队列中每有任何元素,称为空队列,当rear增加到指向分配的连续空间之外,队列无法在插入新元素,但这时往往还有大量的可用的空间未被占用,这些空间是已经出对的队列元素占用过的存储单元。
& & 队尾指针指向队尾元素的下一个位置(也可以让rear指向队尾元素,front指向队头元素的前一个位置,)
& &在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进,无论插入或删除,一旦rear指针增加1或front指针增加1时超出分配的队列空间,就让它执行这片连续空间的起始位置,自己真从MaxSize-1曾1变到0,可用取运算rear% Maxsize和Front%MaxSize来实现,这实际上是吧队列空间想象成一个环形空间,环形空间中存储短语循环使用,用这种方法管理的队列称为循环队列,
在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满,也有front=rear,为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩一个存储单元时,队列就已经满了,因此,队列判空时front=rear,而队列判满时front=(rear+1)%MaxSize.
typedef struct QNode{
& struct QNode *
typedef struct LinkQueue{
& QNode * & & &//指向队头元素
& QNode * & &//指向队尾元素
&Status InitQueue(LinkQueue *q)
& & q-&front=q-&rear=(QNode*)malloc(sizeof(QNode)); & //分配内存空间
& & & &if(!q-&front)
& & & q-&front-&next=
& & return OK;
Status EnQueue(LinkQueue *q,ElemType e) & //插入队列
& & QNode *p=(QNode*)malloc(sizeof(QNode));
& & if(!p)
& & p-&data=e;
& &p-&next=
& &p-&rear-&next=p; & //将新地址保存,入队操作,从队尾(rear)进入
& &q-&rear=p; & //相当于rear++,q-&rear指向下一个位置 &符合入队操作的基本要求
& &return OK;
Status DeQueue(LinkQueue *q,ElemType *e)
& & QNode *p=(QNode *)malloc(sizeof(QNode));
& & if(!p)
& & p=q-&front-&//q 指向的是Front指针的下一个位置,即队首元素。
& &q-&front-&next=p-&//出队操作后,Front++
& &if(q-&rear==p)//判断是否全部出队
& & & &q-&rear=q-&//如果全部出队,则将队列置为空
在循环队列中,Q-&front==Q-&rear并不能确定队列为空,也有可能是队列已满,所以采用队列头指针在队尾指针的下一位置来判断队列已满(此方法会浪费一个内存空间)。
#define MAXQSIZE &100
typedef struct
& & QElemType *
Status InitQueue(SqQueue *Q)
& & Q-&queuesize=MAXQSIZE;
& & Q-&base=(QElemType*)malloc(Q-&queuesize *sizeof(QElemType));
& & if(Q-&base==NULL)
return ERROR;
& & Q-&front=Q-&rear=0;
& & &return OK;
int QueueLength(SqQueue *Q)
& & & return((Q-&rear-Q-&front+Q-&queuesize)%Q-&queuesize);
Status EnQueue(SqQueue *Q,QEletype e)
//在循环队列中,Q-&front==Q-&rear并不能确定,队列为空,也有可能是队列已满
//所以采用队列头指针在队尾指针的下一位置来判断队列已满
& if((Q-&rear+1)%Q-&queuesize==Q-&front)
& & & Q-&base =(QElemType*)realloc(Q-&base,Q-&queuesize);
& & if(Q-&base==null)
& & &Q-&queuesize*=2;
& Q-&bse[Q-&rear]=e;
& Q-&rear=(Q-&rear+1)%Q-&
& &return OK;
Status DeQueue(SqQueue *Q,QElemType *e)
& &if(Q-&front==Q-&rear)
& &*e=Q-&base[Q-&front];
& &Q-&front=(Q-&front+1)%Q-&
& &return OK;
Status DestroyQueue(SqQueue*Q)
& & free(Q-&base);
& & &return OK;
int main()
& &SqQueue Q;
& & InitQueue(&Q)
& &for(i=0;i&MAXQSIZE*10;++i)
& & & if(EnQueue(&Q,i)!=OK)
& & & & &return -1;
& & &while(Q.front!=Q.rear)
DeQueue(&Q,&e);
& & & & & & & & printf(&%d\n&,e);
& & DestroyQueue(&Q);
& & return 0;
相关文章推荐判断一个循环队列q最多元素为m个,满队列的条件是什么_百度知道
判断一个循环队列q最多元素为m个,满队列的条件是什么
有front和rear时,尾指针指向队尾,用m--,当front等于rear时,判断m是否为0
采纳率:30%
(rear+1)%m==front
为您推荐:
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
【精品】数据结构考研试题,数据结构考研试题,数据结构试题及答案,数据结构试题,数据结构笔试题,考研数据结构,数据结构考研视频,数据结构考研辅导,考研计算机数据结构,考研试题
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
【精品】数据结构考研试题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口数据结构学习第二弹 栈与队列(2) - 简书
数据结构学习第二弹 栈与队列(2)
队列,可以说是日常生活中最常见的一种现象,队列与平时排队有着相似的特点。队列也是一种运算受限制的线性表,与栈不同的是,其是限制在两端操作的线性表
队列就跟日常排队有一样的特点:先进先出,只允许在队列的一端插入数据元素(入队),只允许在队列的另一端删除数据元素(出队),可删除的一端称为队头,可插入的一端称为队尾。
队列的修改总是按照先进先出的原则进行的,也就是说新的元素,只能添加在对尾,每次离开的元素只能从队头离开,就和排队打饭一样,不过这个队不允许中途离队,比如队列中加入元素a1,a2,a3……an,a1就是队头元素,an就是队尾元素,退出队列的顺序也只能是a1,a2……an.
队列的基本操作
InitQueue(Q):
构造一个空队列
EmptyQueue(Q):
判断一个队列是否为空
LengthQueue(Q):
求队列的长度
FrontQueue(Q,e):
获取队头元素
EnQueue(Q,e):
DeQueue(Q,e):
和栈同理,队列也可以分为顺序队列和链队列。
顺序存储结构的类型定义
#define MAXSIZE 20
//单纯的空间大小,并不能代表队列中的元素有多少
typedef int ElemT
typedef struct
ElemType data[MAXSIZE];
int front,
//尾指针和头指针
#define OK 1
#define ERROR 0
typedef int S
//将队列初始化置为空
Status InitQueue(SeQueue *q)
q-&front = 0;
q-&rear = 0;
return OK;
//判断队列是否为空
int EmptyQueue(SeQueue *q)
if(q-&front == q-&rear)
//获取队列长度
int LengthQueue(SeQueue q)
return q.rear-q.
//队尾指针减去队头获得长度
//入队操作
Status EnQueue(SeQueue *q,ElemType e)
if(q-&rear == MAXSIZE)
printf("FULL\n");
return ERROR;
q-&data[q-&rear] =
//入队操作
q-&rear++;
//队尾指针向后移
return OK;
//获取队头元素
Status FrontQueue(SeQueue *q,ElemType *e)
if(EmptyQueue(q))
printf("Empty\n");
return ERROR;
*e = q-&data[q-&front];
return OK;
//出队操作
Status DeQueue(SeQueue *q,ElemType *e)
if(EmptyQueue(q))
printf("Empty\n");
return ERROR;
*e = q-&data[q-&front];
//出队操作
q-&front++;
return OK;
由于出队操作和入队操作中,头尾指针只会增加,所以会导致被删除元素无法被重新利用,所以有一种情况,当队列中元素个数少于最大空间时,但也会因为尾指针超过空间上限而不能做入队操作。所以这种队列还是很弱的,但是如果表示成循环队列就能克服这种情况了
(脑补长成一条的队列被拗成环的样子)当队尾指针移动到空间的上限位置时,因为这是一个环,所以队尾指针还可以继续移动下去进入到数组最小下标的位置(用取模来实现),这样就可以最大限度的利用存储空间了。
还有一个要解决的问题就是如何判断队满,有两种解决方案:
因为是环所以当头尾指针相等就是队满的情况了,但是一开始的
时候如果头尾指针相等就是队空了,所以可以多开设一个一个变量
来记录队空还是队满
还有一个比较简便的方法就是空出一格来,这样队满和队空就可
以被区分了(下面有这种来处理队满情况)
循环队列的具体操作:
循环队列也是用的顺序存储结构,所以类型定义和顺序队是基本一样的,而在部分运算操作上就有些不同了。
//队列长度
int LengthQueue(SeQueue q)
int len = (q.rear-q.front+MAXSIZE)%MAXSIZE;
//入队操作
Status EnQueue(SeQueue *q,ElemType e)
if((q-&rear+1)%MAXSIZE == q-&front)//牺牲多一个空间来判断队满的情况
return ERROR;
q-&data[rear] =
q-&rear = (q-&rear+1)%MAXSIZE;
//尾指针加一并保证循环状态
return OK;
//出队操作
Status DeQueue(SeQueue *q,ElemType *e)
if((q-&rear+1)%MAXSIZE == q-&front)
return ERROR;
*e = q-&data[q-&front];
q-&front = (q-&front+1)%MAXSIZE;//头指针加一并保证循环意义
顾名思义,用链表来表示的队列被称为链队。链队的结点结构和单链表是一样的,只不过队列的插入和删除操作是分别在队尾和队头进行的。因此除了设置头指针外还要设置尾指针在指向队尾,为了方便,这里采用有头结点的单链表来表示队列
队列的链式存储结构类型定义
typedef int ElemT
//数据类型
typedef struct node
struct node *
typedef struct
QueueNode *
QueueNode *
链队运算的具体操作
//初始化队列置为空
Status InitQueue(LinkQueue *q)
QueueNode *
head = (QueueNode*)malloc(sizeof(QueueNode));//为头结点开辟存储空间
//空间申请失败
return ERROR;
head-&next = NULL;
//头结点指针域置为空
//头指针指向头结点
//尾指针指向头结点
//判断队列是否为空
Status EmptyQueue(LinkQueue *q)
return q-&rear == q-&
//获取队头元素
Status FrontQueue(LinkQueue *q.ElemType *e)
if(EmptyQueue(q))
//队列为空
return ERROR;
*e = q-&front-&
return OK;
//元素入队
Status EnQueue(LinkQueue *q,ElemType e)
QueueNode *s;
s = (QueueNode*)malloc(sizeof(QueueNode));
//为新结点申请空间
//申请空间失败
return ERROR;
//新结点数据域赋值
s-&next = NULL;
//新结点指针域置为空
q-&next-&next =
//新结点插入到队尾
//更新尾结点
return OK;
//元素出队
Status DeQueue(LinkQueue *q,ElemType *e)
if(EmptyQueue(q))
return ERROR;
QueueNode *s;
s = q-&front-&
//s指向队头元素
q-&front-&next = s-&
//将s指向的元素移出队列
if(q-&rear = s)
//如果移出的元素是最后一个
q-&rear = q-&
//队尾指针指向头结点
//用e返回移出的元素值
return OK;
1、线性表、栈和队列等数据结构所表达和处理的数据以线性结构为组织形式。栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称后...
转载请注明出处:/p/462b 上一篇《数据结构与算法(二),线性表》中介绍了数据结构中线性表的两种不同实现——顺序表与链表。这一篇主要介绍线性表中比较特殊的两种数据结构——栈与队列。首先必须明确一点,栈和队列都是...
本文内容取自于小甲鱼的数据结构与算法。/p/230e6fde9c75 1. 线性表 线性表(List):由零个或多个数据元素组成的有限序列。 这里需要强调几个关键的地方: 首先它是一个序列,也就是说元素之间是有个先来后到的。若元素...
1.栈 1.1.栈的定义 栈(stack)是限定仅在表尾(栈顶 top)进行插入和删除操作的后进先出的线性表。 push、pop 操作在栈顶进行。 1.2.
栈的顺序存储结构及实现 栈的结构定义 现在有一个栈,StackSize是5,则栈普通情况、空栈和栈满的情况、空...
我们在使用手机的时候,偶尔都会碰到过卡住的时候,比如一个地方怎么点都没有用,屏幕也卡住不显示其他东西,但当你把卡住的App关闭掉之后,手机的操作显示就又恢复正常了,其实这就是因为操作系统中的各个程序的指令堆积在一起排队执行,而某一个App卡住的时候,大家都卡住了。 操作系统...
当岁月荏苒,穿过五千年的风雨 当时光流逝,书写五千年的辉煌 耳畔再次响起,那中国共产党实现中华民族伟大复兴的中国梦 梦想-平凡而又寄托着希望,习主席提出的实现中华民族伟大复兴的中国梦,令人憧憬、催人奋进,成为凝聚全党全国人民团结奋斗的时代号角。 在党的领导下,中国的经济发展...
火车上,我的计划是看四部电影。 《布鲁克林》和《成为简奥斯汀》是因为怀念而要重温的经典,《寻龙决》是室友力荐的国产片,而《海蒂和爷爷》是一部来自阿尔卑斯山的治愈系故事片。 刚刚看完《海蒂和爷爷》,纯真的感情流露让我一会儿哭,一会儿笑,已全然忘记自己在火车上,周围都是诧异的陌...
各位好,欢迎打开我的晨读感悟。 每天写作一千字,坚持带来大改变。 今天我阅读的是日本作家川上彻也的《一言力》,这本书很有意思啊,用大量的案例告诉我们其实语言也可以像一把火一样,燃烧起对方的热情;也可以像一个拳头,赋予对方力量,而最终的目的是: 让我们花时间说出去的话,更有价...
48款咖啡的制作方法,配成品图,教你做出自己喜欢的咖啡,做一个自由的咖啡达人。(内容较长,多图,建议在WiFi下浏览,壕随意~) 1.拿铁咖啡 2.玛琪雅朵 3.冰摩卡咖啡 4.鸳鸯冰咖啡 5.香浓泡沫冰咖啡 6.苏格兰爱丽丝咖啡 7.飘浮冰咖啡 8.爪哇摩卡咖啡 9.椰香...
大明湖畔美丽的风景,蛇不见、蛙不鸣;久雨不涨、久旱不涸;是大明湖的两大独特之处。 大明湖历史悠久,景色秀丽,名胜古迹繁多,历下亭、铁公祠、汇波楼、北极庙、暇园、超然楼,伫立于明湖之中。尤其是大明湖乃繁华都市之中的天然湖泊,更是实属难得…… 皇上:“您还记得大明湖畔的夏雨荷吗...设循环队列的存储空间_中华文本库
设长度为n的链队用单循环链表表示, 3.3 设长度为n的链队用单循环链表表示,...能够使存储队列的向量空间得到充分的利用。 判别循环队列的&空或满 不能以头尾...
双向栈 S 是在同一向量空间内实现的两个栈,它们的栈底分别设在向量空间的...解: 根据题意,可定义该循环队列的存储结构: #define QueueSize 100 typedef ...
要求结果链表仍使用原来两个链表的存 储空间, 不另外占用其它的存储空间。表中...(^表示乘方运算) 22.设循环队列的容量为 70(序号从 1 到 70) ,经过一系列...
顺序存储队列的假溢出的避免方法及循环队列满和空的条件判断 设顺序存储队列用...判断循环队列的状态有两种方法: 1 少用一个元素空间约定以 “队列头指针在队列...
( B ) A)4,3,2,1 B)1,2,3,4 C)1,4,3,2 D)3,2,4,1 (11)设数组 data[0..m]作为循环队列 SQ 的存储空间,front 为队头指针,rear 为队尾...
5.设有一个顺序循环队列中有 M 个存储单元,则该循环队列中最多能够存储___...(√) 9. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应...
基本操作的算法描述 设下标为 index,队列长度为 m,则下一个下标的累进循环计算...算法描述 Status QueueLength(SqQueue Q) //存储空间基址 //头指针 //尾指针...
循环队列存储空间的动态扩充方法 摘要:循环队列在定义时总是事先规定一个最大值 maxsize 来 确定队列的最大存储空间,在使用中若初始值 maxsize 太小会造成 存储...
6. 设有一个顺序循环队列如上题中的约定,则该队列满的条件是___, 队列空的...设用一维数组 s[m]表示栈的存储空间,用 top 指向当前栈顶元素(其初始值 为...

我要回帖

更多关于 设顺序循环队列q 的文章

 

随机推荐