火车车厢重排问题队列c语言.docx
- 文档编号:8136615
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:12
- 大小:17.43KB
火车车厢重排问题队列c语言.docx
《火车车厢重排问题队列c语言.docx》由会员分享,可在线阅读,更多相关《火车车厢重排问题队列c语言.docx(12页珍藏版)》请在冰豆网上搜索。
火车车厢重排问题队列c语言
计算机科学与工程学院
《算法与数据结构》试验报告[一]
专业班级
10级计算机工程02
试验地点
计算机大楼计工教研室
学生学号
22
指导教师
蔡琼
学生姓名
肖宇博
试验时间
2012-4-21
试验项目
算法与数据结构
试验类别
基础性()设计性()综合性(√)
其它()
试
(1)掌握队列的特点及其存储方法;
验
目
(2)掌握队列的常见算法和程序实现。
的
及
要
求
成绩评定表
类
别
评分标准
分值
得分
合
计
上机表现
积极出勤、遵守纪律
30分
主动完成设计任务
程序与报告
程序代码规范、功能正确
70分
报告详实完整、体现收获
备注:
评阅教师:
日期:
年月日
试验内容
一、实验目的和要求
1、实验目的:
(1)掌握队列的特点及其存储方法;
(2)掌握队列的常见算法和程序实现。
2、实验内容:
火车车厢重排问题。
转轨站示意图如下:
H1
3
H
3
入轨
H2
963
1
581
H
H
入轨
3
出轨
742
H2
(a)将369、247依次入缓冲轨
96
H
1
5
54321
入轨
H3
出轨
87
H2
(c)将8入缓冲轨,5移至出轨
1
出轨
96
H1
58
4321
H
入轨
3
出轨
7
H2
(b)将1移至出轨,234移至
出轨
H
1
1
入轨
H3
出轨
H2
(d)将6789移至出轨
火车车厢重排算法伪代码如下:
1.分别对k个队列初始化;
2.初始化下一个要输出的车厢编号nowOut=1;
3.依次取入轨中的每一个车厢的编号;
如果入轨中的车厢编号等于nowOut,则输出该车厢;
nowOut++;
否则,考察每一个缓冲轨队列
for(j=1;j<=k;j++)
取队列j的队头元素c;
如果c=nowOut,则
将队列j的队头元素出队并输出;
nowOut++;
如果入轨和缓冲轨的队头元素没有编号为nowOut的车厢,则
求小于入轨中第一个车厢编号的最大队尾元素所在队列编号j;
如果j存在,则把入轨中的第一个车厢移至缓冲轨j;
如果j不存在,但有多于一个空缓冲轨,则把入轨中的第一个车厢移至一个空缓
冲轨;否则车厢无法重排,算法结束;
3、实验要求:
使用顺序存储队列的方式完成该实验。
二、设计分析
根据实验要求,采用队列来完成本次实验。
实验中定义了三个队列,一个用来存储输入的车厢号,另两个用来存储缓存出队顺序及序号。
三、源程序代码
#include<>
#include<>
#defineMax20
typedefstruct
{
intdata[Max];
intfront,rear;
}squeue;
voidinitqueue(squeue*&q)
{
q=(squeue*)malloc(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,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",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++)
{
if(a[i]!
=i)
{
return0;
break;
}
}
}
voidmain()
{
squeue*q,*w1,*w2;
initqueue(q);
initqueue(w1);
initqueue(w2);
inta[10],k;
label:
printf("要输入几个车厢?
\n");
scanf("%d",&k);
if(k<=0)
{
printf("请输入正确的车厢号!
\n");
printf("****************************************************");
printf("\n");
gotolabel;
}
label2:
printf("输入重排前的序列\n");
for(inti=1;i<=k;i++)
{
scanf("%d",&a[i]);
enqueue(q,a[i]);
}
intr=examenter(a,k);
if(r==0)
{
printf("您的输入车厢号有误!
请输入连续自然数:
\n");gotolabel2;
}
elseif(r!
=0)
{
printf("重排前的序列为\n");
for(i=1;i<=k;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
printf("排列后的车厢号为:
\n");
reset(q,w1,w2,k);
}
else
{
printf("我也不知道错哪了?
'");
}
}
四、测试用例(尽量覆盖所有分支)
1.输入正确的序列后得到结果如图:
2.倒输这几个数如图:
3.顺序输这个序列
4.如果输入的车厢数有误的时候(为负数或零)
5.如果输入的序列不是连续自然数
五、实验总结
先后学习了C/C++,对编程语言基本上有一些了解,但在数据结构试验程序设计过程中还是学到了很多。
经过两天的设计,在不断翻阅以前资料的情况下,有针对性的复习了C/C++
中指针、循环的相关理论知识和的基础知识和应用技巧,最后比较成功的完成
了本次的设计。
这次的实验是完成火车厢重徘问题,依旧采用的检查用户的错误输入机制,充分考虑了用户的各种错误,比如输入的序列不是连续自然数,如果输入的车厢数有误的时候(为负数或零)等等的情况,完成了该次实验,主要出现的问题在于数组的下标问题,老是出现越界访问错误等等,这要在下次的实验当中多加注意!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 火车 车厢 重排 问题 队列 语言