版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上实验二:火车车厢重排问题 班级:2010级数学班 学号:7 姓名:裴志威 一.问题描述:一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1n,货运列车按照第n站至第1站的顺序经过这些车站。车厢编号与他们的目的地一样。为了便于从列车上卸掉相应的车厢,必须重排车厢顺序,使得各车厢从前往后按编号1到n的次序排列。当所有车厢按照这种次序排列时,在每个车站只需卸掉最后一个车厢即可。我们在一个转轨站里完成重拍的工作,在转轨站有一个入轨,一个出轨和k个缓冲轨(位于入轨和出轨之间)。二.基本要求:(1):设计存储结构表示n个车厢,k个缓冲轨以及入轨和出轨
2、,(2)设计并实现车厢重排算法,(3)分析算法的时间性能。三.算法描述:为了重排车厢,需从前往后依次检查入轨上的所有车厢。如果正在检查的车厢就是下一个满足要求的车厢,可以直接把它放到出轨上。否则,则把它移动到缓冲轨上,直到按输出顺序要求轮到它的时候才可以将他放到出轨上。缓冲轨是按照FILO的方式使用的,因为车厢的进出都是在缓冲轨的顶端进行的。在重排车厢过程中,仅允许以下活动:1、车厢可以从入轨的前部移动到一个缓冲轨的顶部或者是出轨的左端2、车厢可以从一个缓冲轨的顶部移动到出轨的左端在将车厢放入缓冲轨的过程中,应该注意:有空的可以优先放,没空的缓冲轨时,要将新的车厢放在满足以下条件的缓冲轨中:在
3、缓冲轨的顶部车厢编号比新车厢的编号大的所有缓冲轨中选择顶部车厢编号最小的那个。四.伪代码:1. 分别对k个队列初始化;2. 初始化下一个要输出的车厢编号nowOut = 1; 3. 依次取入轨中的每一个车厢的编号;3.1 如果入轨中的车厢编号等于nowOut,则 3.1.1 输出该车厢; 3.1.2 nowOut+;3.2 否则,考察每一个缓冲轨队列 for (j=1; j<=k; j+) 3.2.1 取队列 j 的队头元素c; 3.2.2 如果c=nowOut,则 3.2.2.1 将队列 j 的队头元素出队并输出; 3.2.2.2 nowOut+; 3.3 如果入轨和缓冲轨的队头元素没
4、有编号为nowOut的车厢,则 3.3.1 求小于入轨中第一个车厢编号的最大队尾元素所在队列编号j;3.3.2 如果 j 存在,则把入轨中的第一个车厢移至缓冲轨 j;3.3.2 如果 j 不存在,但有多于一个空缓冲轨,则把入轨中的第一个车厢移至一个空缓冲轨;否则车厢无法重排,算法结束;五.源程序代码:#include<stdio.h>#include<stdlib.h>#define Max 20typedef structint dataMax;int front,rear;squeue;void initqueue(squeue *&q)q=(squeue
5、*)malloc(sizeof(squeue);q->front=q->rear=0;void enqueue(squeue *&q,int e)q->rear=(q->rear+1)%Max;q->dataq->rear=e;void dequeue(squeue *&q)q->front=(q->front+1)%Max;int gettop(squeue *&q)return q->dataq->front+1;int getrear(squeue *&q)return q->dataq-&
6、gt;rear;void reset(squeue *&q,squeue *&w1,squeue *&w2,int k)int nowout=1;int n1=0,n2=0;for(int i=0;i<50;i+)if(q->dataq->front+1=nowout)printf("%d号车厢出轨!t",q->dataq->front+1);nowout+;dequeue(q);else if(gettop(w1)=nowout)printf("%d号车厢出轨!t",gettop(w1);nowou
7、t+;dequeue(w1);else if(gettop(w2)=nowout)printf("%d号车厢出轨!t",gettop(w2);nowout+;dequeue(w2);elseint c=gettop(q);n1=getrear(w1);n2=getrear(w2);if(n1>n2)if(c>n1)enqueue(w1,c);dequeue(q);elseenqueue(w2,c);dequeue(q);elseif(c>n2)enqueue(w2,c);dequeue(q);elseenqueue(w1,c);dequeue(q);int
8、 examenter(int a,int k)for(int i=1;i<=k;i+)if(ai!=i)return 0;break;void main()squeue *q,*w1,*w2;initqueue(q);initqueue(w1);initqueue(w2);int a10,k;label:printf("要输入几个车厢?n");scanf("%d",&k);if(k<=0)printf("请输入正确的车厢号!n");printf("*");printf("n"
9、);goto label;label2:printf("输入重排前的序列n");for(int i=1;i<=k;i+)scanf("%d",&ai);enqueue(q,ai);int r=examenter(a,k);if(r=0)printf("您的输入车厢号有误! 请输入连续自然数:n");goto label2;else if(r!=0)printf("重排前的序列为n");for(i=1;i<=k;i+)printf("%dt",ai);printf("
10、n");printf("排列后的车厢号为:n");reset(q,w1,w2,k);elseprintf("我也不知道错哪了?'");六.测试结果1.输入正确的序列后得到结果如图:2.如果输入的车厢数有误的时候(为负数或零)六、总结 本次数据结构实验主要是练习使用队列的思想,我做的是火车重排问题的实验,此实验在课本上有一些讲解,也给出来主要函数TrainPermute()的主要编写思路,减轻了自己的工作量,不过由于此程序的代码比较复杂,在编译调试过程中也很耗费时间,通过设置断点,分步调试,才使得程序没有了bug。例如,由于程序用了较多的循环,包括多重循环,在刚刚写出代码的时候常常陷入死循环,而因为代码冗长,仅仅通过看代码很难找出逻辑上的错误。功夫不负有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年04月中国农业发展银行广东省分行纪委办调查专业人才社会招考笔试历年参考题库附带答案详解
- 2025年度常州消防设施检测与鉴定合同4篇
- 2024版水泥混凝土运输合同书
- 2025年度城市基础设施配套拆迁施工合同4篇
- 专业菊花供应商2024年销售协议版B版
- 《流行病症:新型冠状病毒肺炎》课件
- 二零二五年度玻璃原材料期货交易合同6篇
- 2024年03月广东中信银行深圳分行社会招考笔试历年参考题库附带答案详解
- 二零二五版存量房市场政策研究合同3篇
- 2024简易散伙协议规范格式
- 四川省高职单招电气技术类《电子基础》历年考试真题试题库(含答案)
- 窦性心动过速的危害
- 深基坑工程基坑土方开挖及支护降水施工方案
- 2024年江西生物科技职业学院单招职业技能测试题库带解析答案
- 医药制造企业资本结构优化研究以贵州百灵为例
- GB 31335-2024铁矿开采和选矿单位产品能源消耗限额
- 医院高风险意外事件应急措施和救护机制
- 桥本甲状腺炎-90天治疗方案
- 【复合附件版】个人借车免责协议书简单
- 焊接工装夹具设计手册
- 医院开展急救知识培训计划方案
评论
0/150
提交评论