欢迎来到天天文库
浏览记录
ID:18793147
大小:66.00 KB
页数:6页
时间:2018-09-24
《火车车厢重排问题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验二:火车车厢重排问题班级:2010级数学班学号:201008101127姓名:裴志威一.问题描述:一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1~n,货运列车按照第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.2nowOut++;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.2nowOut++;3.3如果入轨和缓冲
4、轨的队头元素没有编号为nowOut的车厢,则3.3.1求小于入轨中第一个车厢编号的最大队尾元素所在队列编号j;3.3.2如果j存在,则把入轨中的第一个车厢移至缓冲轨j;3.3.2如果j不存在,但有多于一个空缓冲轨,则把入轨中的第一个车厢移至一个空缓冲轨;否则车厢无法重排,算法结束;五.源程序代码:#include#include#defineMax20typedefstruct{intdata[Max];intfront,rear;}squeue;voidinitqueue(squeue*&q){q=(squeue*)mallo
5、c(sizeof(squeue));q->front=q->rear=0;}voidenqueue(squeue*&q,inte){q->rear=(q->rear+1)%Max;q->data[q->rear]=e;}voiddequeue(squeue*&q){q->front=(q->front+1)%Max;}intgettop(squeue*&q){returnq->data[q->front+1];}intgetrear(squeue*&q){{returnq->data[q->rear];}}voidreset(squeue*&q,squeue*&w1
6、,squeue*&w2,intk){intnowout=1;intn1=0,n2=0;for(inti=0;i<50;i++){if(q->data[q->front+1]==nowout){printf("%d号车厢出轨!t",q->data[q->front+1]);nowout++;dequeue(q);}elseif(gettop(w1)==nowout){printf("%d号车厢出轨!t",gettop(w1));nowout++;dequeue(w1);}elseif(gettop(w2)==nowout){printf("%d号车厢出轨!t",
7、gettop(w2));nowout++;dequeue(w2);}else{intc=gettop(q);n1=getrear(w1);n2=getrear(w2);if(n1>n2){if(c>n1){enqueue(w1,c);dequeue(q);}else{enqueue(w2,c);dequeue(q);}}else{if(c>n2){enqueue(w2,c);dequeue(q);}else{enqueue(w1,c);dequeue(q);}}}}}intexamenter(inta[],intk){for(inti=1;i<=k;i++){i
此文档下载收益归作者所有