




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
循环队列存储空间传统扩充与动态扩充之优劣摘要:循环队列在定义时总是事先规定一个最大值maxsize来确定队列的最大存储空间,在使用中若初始值maxsize太小会造成存储空间不够用的问题。一般的做法是停止程序的执行,修改maxsize的值。若maxsize太大则会造成存储空间的浪费,不能实现动态扩充的目的。在此提出了一种新的实现循环队列存储空间动态扩充的方法,解决了存储空间不够用的问题,同时也成功地避免了循环队列中存储空间的浪费问题。最后比较了此方法与传统方法的优劣。关键词:循环队列;存储空间;动态分配;自动扩充the advantages and disadvantages of the traditional expansion and dynamic expansion for circular queue storage spacezhang haixia(zhangye medical college,zhangye734000,china)abstract:the circular queue definition is always predetermined a maximum value of maxsize to determine the maximum storage space of the queue,use the initial value of maxsize is too small will cause the problem of not enough storage space.the general practice is to stop the implementation of the program,modify the value of maxsize.if maxsize is too large will result in a waste of storage space,can not achieve the purpose of dynamically expanding.put forward a new dynamically expanding circular queue storage space to solve the problem of not enough storage space,but also succeeded in avoiding the waste of storage space in the circular queue.finally,a comparison of the pros and cons of this method with the traditional method.keywords:circular queue;storage space;dynamically allocated;automatically expand在限定性线性表队列的顺序存储结构中,使用队列时都要将队列从逻辑上看成一个环即循环队列。这样是为了克服“假上溢”现象,节省计算机的存储空间。循环队列在定义时总是事先规定一个最大值maxsize来确定队列的最大存储空间,在使用中若初始值maxsize太小会造成存储空间不够用的问题。一般的做法是停止程序的执行,修改maxsize的值。若maxsize太大则会造成存储空间的浪费,不能实现动态扩充的目的。有没有方法能让队列在使用中想占用多少空间就占用多少空间,实现自动扩充,最大程度地避免对内存空间的浪费呢?以解决此问题为目的,本文提出了一种新的实现循环队列存储空间动态扩充的方法,解决了存储空间不够用的问题,同时也成功地避免了循环队列中存储空间的浪费问题。一、传统扩充方法循环队列的存储结构及基本操作定义如下:#define maxsize 50/循环队列的初始大小typedef structelemtype elemmaxsize; /循环队列的存储空间int front ,rear;/循环队列的队头和队尾指针 seqqueue;statusinitqueue(seqqueue *q) /循环队列初始化操作传统算法描述q-front=q-rear=0; return ok;statusenterqueue(seqqueue *q,elemtype e)/循环队列入队操作算法描述if(q-rear+1)%maxsize=q-front) /队满则不能入队return error;q-elemq-rear=e;q-rear=(q-rear+1)%maxsize;return ok;statusdeletequeue(seqqueue *q,elementtype *e)/循环队列出队操作算法描述if(q-rear=q-front)/队空不能出队return error;*e=q-elementq-front;q-front=(q-front+1)%maxsize;return ok;int queuelength(seqqueue q)/循环队列求队长操作算法描述return (q.rear-q.front+maxsize)%maxsize);在循环队列的应用中,如果数据元素有进有出,且存储在队列中的元素个数始终小于maxsize时,上述的操作完全可以解决。但是若数据元素把空间都占满又有元素需要入队,那么上述算法就无法解决了,只能出现“溢出”,数据元素入队不成功。有人会认为可以在定义maxsize时将其放大到最大程度,但会发现maxsize越大,造成的空间浪费就越大;也有人会提出在空间不够用时,停止程序的执行,再将maxsize放大一些,但是在一些大型系统开发中,系统一旦投入运行,就很难停止下来。二、动态扩充方法针对上面的问题,可以将elemtype定义为指针类型*elem,而非数组,这样就不需要对循环队列设置最大值maxsize,而是给循环队列设置初始值queue_init_size,通过c语言提供的动态内存函数malloc,给该指针分配存储空间,且附设一个size来表示该空间的当前大小,若在程序执行中出现队满的情况,可以通过realloc函数将该空间进行扩充,使其增加increment个单元。其新的类型定义如下:#define queue_init_size 20/循环队列存储空间的初始分配量# define increment 5/循环队列存储空间的分配增量typedef structelemtype *elem;/存储空间基址int front,rear; /队头和队尾的当前位置int size; /当前分配的存储容量seqqueue;依照上述定义方法,在进行循环队列的初始化时,需要调用malloc函数开辟队列的初始空间。其描述如下:int initqueue(seqqueue *q)q-elem=(elemtype *)malloc(queue_init_size*sizeof(elemtype);if(!q-elem)return error;q-front=q-rear=0;q-size=queue_init_size;return ok;研究队列的基本操作会发现,只有在数据元素入队时才会出现存储空间不够用的问题。若循环队列中数据元素不足q-size-1个,则按常规操作让元素入队。否则,若循环队列中已有q-size-1个元素,即q-rear的后面一个位置是q-front,则表示队满需拓展,这时可以通过realloc函数扩充队列的存储空间,扩充的具体方法为:首先通过realloc函数让q-elem所指的单元增加increment;若出现q-frontq-rear,此时需要把从q-front开始到q-size-1结束的cnt个数据元素移向q-size+increment-cnt-1到q-size+increment-1单元。最后再修改q-size的值为q-size+increment,修改q-front的值为q-front-cnt。这样队列得到自动扩充,再按传统方法进行入队。其算法描述如下:int enterqueue(seqqueue *q,elemtype e)int i,j,cnt;elemtype *newbase;if(q-rear+1)%q-size)=q-front)/队列已满,需要进行存储空间扩充newbase=(elemtype*)realloc(q-elem,(q-size+increment)*sizeof(elemtype);if(!newbase)return error;q-elem=newbase;if(q-frontq-rear)for(i=q-size-1,j=q-size+increment-1;i=q-front;i-,j-)q-elemj=q-elemi;cnt=q-size-q-front;q-size=q-size+increment;q-front=q-size-cnt;elseq-size=q-size+increment;q-elemq-rear=e;q-rear=(q-rear+1)%q-size;return ok;上述方法其实质是将线性表链式存储结构中的空间动态分配操作应用到了循环队列中。当不能确定进入循环队列中的数据元素的最大个数时,可以用此种方法设置初值,再根据具体情况设置增量,这样就可以最大程度地避免对内存的浪费。此方法的出队、判空、求队长等操作同传统方法无异。只是将传统方法中用到的maxsize变为q-size,此处不再赘述。三、优劣性比较在循环队列的应用中,若需要存储在队列中元素个数有确定的上限,则完全可以用传统方法解决。将此上限作为循环队列的容量maxsize来用。通过以上分析论述,可以看到动态分配方法与传统方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年精神科心理评估与干预技术考核答案及解析
- 实践对新质生产力的重要性
- 2025年放射肿瘤科学科放射肿瘤治疗计划考核答案及解析
- 2025年内分泌代谢疾病诊断与治疗方案考核测试卷答案及解析
- 2025年肾脏疾病患者营养支持方案设计考试卷答案及解析
- 2025年口腔颌面外科手术规范操作实践答案及解析
- 2025年全科医生对高血压病患者的常规检查简述答案及解析
- 2025年职业病防治学职业健康检测实操考核答案及解析
- 县域新质生产力:发展路径与研究课题
- 工会推动新质生产力实践
- 2025年监理工程师继续教育试卷及答案
- 2020-2025年注册土木工程师(水利水电)之专业基础知识通关考试题库带答案解析
- 2025年物流师(初级)物流企业物流信息化信息安全认证员培训鉴定试卷
- 2.1人的社会化 教案 2025-2026学年统编版道德与法治八年级上册
- 2025入团考试题库(完整版)附答案详解
- 2025年北京市中考物理真题(含答案)
- 外科手术抗生素使用原则
- 2025年环卫清扫职称考试题及答案
- 《酒店营销与数字化实务》课件5模块五课件
- 2025年秋期新课标人教版六年级上册数学全册教案(核心素养教案)
- 《“忆峥嵘岁月传红色抗战精神”党课教育主题活动》课件
评论
0/150
提交评论