火车重排问题

合集下载

火车车厢重排问题,队列,c语言

火车车厢重排问题,队列,c语言

计算机科学与工程学院
《算法与数据结构》试验报告[一]
专业班级10级计算机工程02 试验地点计算机大楼计工教研室学生学号1005080222 指导教师蔡琼
学生姓名肖宇博试验时间2012-4-21
试验项目算法与数据结构
试验类别基础性()设计性()综合性(√)其它()试
验目的及要求(1)掌握队列的特点及其存储方法;(2)掌握队列的常见算法和程序实现。

成绩评定表
类别评分标准分值得分合计
上机表现积极出勤、遵守纪律
主动完成设计任务
30分
程序与报告程序代码规范、功能正确
报告详实完整、体现收获
70分
goto label2;
}
else if(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.如果输入的序列不是连续自然数。

实验2用堆栈解决火车车厢重排问题的编程

实验2用堆栈解决火车车厢重排问题的编程

实验2用堆栈解决火车车厢重排问题的编程一、目的通过对本次实验,我们应:1、加深对线性表、堆栈的认识;2、加深接口、类、索引器的认识;3、掌握堆栈数据结构,并应用堆栈编程解决实际问题。

二、实验准备1、软件准备:C#.net。

2、参考数据(示例):文件夹“…\实验2\示例”中的数据。

三、实验背景描述1、问题描述一列货运列车共有n节车厢,每节车厢将停放在不同的车站。

假定n个车站的编号分别为1 -n,货运列车按照第n站至第1站的次序经过这些车站。

车厢的编号与它们的目的地相同。

为了便于从列车上卸掉相应的车厢,必须重新排列车厢,使各车厢从前至后按编号1到n的次序排列。

当所有的车厢都按照这种次序排列时,在每个车站只需卸掉最后一节车厢即可。

我们在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨、一个出轨和k个缓冲铁轨(位于入轨和出轨之间)。

图3.1a 给出了一个转轨站,其中有k= 3个缓冲铁轨H1,H2和H3。

开始时,n节车厢的货车从入轨处进入转轨站,转轨结束时各车厢从右到左按照编号1至编号n的次序离开转轨站(通过出轨处)。

在图3.1a 中,n= 9,车厢从后至前的初始次序为5,8,1,7,4,2,9,6,3。

图3.1b 给出了按所要求的次序重新排列后的结果。

图2.1根据上面的描述,编写程序实现下面的功能:编写一算法实现火车车箱的重排;编写程序模拟图2.1所示的具有9节车厢的火车入轨和出轨的过程。

程序主界面设计如图2.2所示。

图2.22、问题分析为了重排车厢,需从前至后依次检查入轨上的所有车厢。

如果正在检查的车厢就是下一个满足排列要求的车厢,可以直接把它放到出轨上去。

如果不是,则把它移动到缓冲铁轨上,直到按输出次序要求轮到它时才将它放到出轨上。

缓冲铁轨上车厢的进和出只能在缓冲铁轨的尾部进行。

当缓冲铁轨上的车厢编号不是按照从顶到底的递增次序排列时,重排任务将无法完成。

新的车厢u应送入这样的缓冲铁轨:其底部的车厢编号v满足v>u,且v是所有满足这种条件的缓冲铁轨顶部车厢编号中最小的一个编号。

火车车厢重排问题,队列,c语言

火车车厢重排问题,队列,c语言

3.顺序输这个序列
4.如果输入的车厢数有误的时候(为负数或零)
5.如果输入的序列不是连续自然数
五、实验总结
先后学习了 C/C++,对编程语言基本上有一些了解,但在数据结构试验程序 设计过程中还是学到了很多。
经过两天的设计,在不断翻阅以前资料的情况下,有针对性的复习了 C/C++ 中指针、循环的相关理论知识和的基础知识和应用技巧,最后比较成功的完成 了本次的设计。 这次的实验是完成火车厢重徘问题,依旧采用的检查用户的错误输入机制,充 分考虑了用户的各种错误,比如输入的序列不是连续自然数,如果输入的车厢 数有误的时候(为负数或零)等等的情况,完成了该次实验,主要出现的问题 在于数组的下标问题,老是出现越界访问错误等等,这要在下次的实验当中多 加注意!
return q->data[q->front+1]; }
int getrear(squeue *&q) {
{ return q->data[q->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++) {
出轨
H1
1
入轨
H3
出轨
H2 (d) 将 6789 移至出轨
火车车厢重排算法伪代码如下:
1. 分别对k个队列初始化; 2. 初始化下一个要输出的车厢编号nowOut = 1; 3. 依次取入轨中的每一个车厢的编号;
如果入轨中的车厢编号等于nowOut,则 输出该车厢; nowOut++;

火车车厢重排问题栈c语言

火车车厢重排问题栈c语言

火车车厢重排问题栈c语言以下是一个用C语言实现火车车厢重排问题的代码:```c#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100typedef struct {int val;struct Node* next;} Node;typedef struct {Node* top;} Stack;Stack* createStack() {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->top = NULL;return stack;}int isEmpty(Stack* stack) {return (stack->top == NULL);}void push(Stack* stack, int val) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->val = val;newNode->next = stack->top;stack->top = newNode;}int pop(Stack* stack) {if (isEmpty(stack)) {printf("Stack is empty.\n");return -1;}int val = stack->top->val;Node* temp = stack->top;stack->top = stack->top->next;free(temp);return val;}int peek(Stack* stack) {if (isEmpty(stack)) {printf("Stack is empty.\n");return -1;}return stack->top->val;}int canReorder(int numCars, int cars[]) { Stack* stationStack = createStack(); Stack* branchStack = createStack(); int nextCar = 1;for (int i = 0; i < numCars; i++) {// 如果当前车厢和需要出站的车厢一致,直接出站if (cars[i] == nextCar) {nextCar++;continue;}// 将从站台出来的车厢压入分支轨道while (!isEmpty(stationStack) && peek(stationStack) == nextCar) {push(branchStack, pop(stationStack));nextCar++;}// 当前车厢进站push(stationStack, cars[i]);}// 如果分支轨道中的车厢可以按顺序出站,则返回1,否则返回0while (!isEmpty(branchStack)) {if (pop(branchStack) != nextCar) {return 0;}nextCar++;}return 1;}int main() {int numCars;int cars[MAX_SIZE];printf("Enter the number of train cars: ");scanf("%d", &numCars);printf("Enter the train car numbers: ");for (int i = 0; i < numCars; i++) {scanf("%d", &cars[i]);}int result = canReorder(numCars, cars);if (result) {printf("Yes, it is possible to reorder the train cars.\n"); } else {printf("No, it is not possible to reorder the train cars.\n"); }return 0;}```输入示例:```Enter the number of train cars: 5Enter the train car numbers: 3 1 2 4 5```输出示例:```Yes, it is possible to reorder the train cars. ```。

火车车厢重排问题,队列,c语言复习课程

火车车厢重排问题,队列,c语言复习课程

计算机科学与工程学院
《算法与数据结构》试验报告[一]
专业班级 10级计算机工程
02
试验地点 计算机大楼计工教研室
学生学号 1005080222 指导教师 蔡琼 学生姓名 肖宇博
试验时间
2012-4-21
试验项目 算法与数据结构
试验类别
基础性() 设计性() 综合性(√) 其它( ) 试验目的及要求
(1)掌握队列的特点及其存储方法; (2)掌握队列的常见算法和程序实现。

成 绩 评 定 表
类 别 评 分 标 准 分值 得分 合 计
上机表现
积极出勤、遵守纪律 主动完成设计任务 30分
程序与报告
程序代码规范、功能正确 报告详实完整、体现收获
70分
goto label2;
}
else if(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++代码
{
a[m].EnterQueue(arr[i]);//入队
i++;//i加一实现了对下一个车厢的操作
p=1;//重新置为1
break; }
}
}
if(p==0) //表示上一节车厢没有被处理,程序结束
{
{ Node<T> *p=front->next;
while(p)
{
if(p==NULL)
break;
else
{
cout<<p->data<<' ';
p=p->next;
}
};
}
void main()
{ int n,k,t;
cin>>k;
if(k<=0) throw"必须存在缓冲轨道!";
cout<<"请依次输入火车车车厢号"<<endl;
for(int i=0;i<n;i++)
{
cin>>main[i];
}
cout<<endl;
LinkQueue<int> *huan;
huan=new LinkQueue<int>[k];
s->next=NULL;
rear->next=s;
rear=s;
}
template<class T>
T LinkQueue<T>::DeQueue()
{
if(rear==front) throw"发生下溢";

队列的应用火车车厢重排问题

队列的应用火车车厢重排问题

一、试验课题队列的应用实验目的:(1)掌握队列的特点及其存储方法;(2)掌握队列的常见算法和程序实现。

二、试验内容(1)问题描述:一列货运列车共有n节车厢,每节车厢将停放在不同的车站。

假定n个车站的编号分别为1~n,即货运列车按照第n站至第1站的次序经过这些车站。

为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同,这样,在每个车站只要卸掉最后一节车厢。

所以,给定任意次序的车厢,必须重新排列它们。

车厢的重排工作可以通过国转轨站完成。

在转轨站中有一个入轨、一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间。

假定缓冲轨按先进先出飞方式运作,设计算法解决火车车厢重排问题。

(2)基本要求:设计存储结构表示n个车厢、k个缓冲轨以及入轨和出轨;设计并实现车厢重排算法;分析算法的时间性能三、试验分析实验说明:转轨站示意图如下:2222(a) 将369、247依次入缓冲轨(b) 将1移至出轨,234移至出轨(c) 将8入缓冲轨,5移至出轨(d) 将6789移至出轨火车车厢重排过程如下:火车车厢重排算法伪代码如下:四、源程序代码#include<iostream>using namespace std;const MS=100;template <class T>struct QNode{T data;QNode<T> *next;};template <class T>class LiQueue{public:LiQueue( ); //构造函数,初始化一个空的链队列~LiQueue( ); //析构函数,释放链队列中各结点的存储空间void EnQueue(T x); //将元素x入队T DeQueue( ); //将队头元素出队T GetFront( ); //取链队列的队头元素T GetRear();bool Empty( ); //判断链队列是否为空QNode<T> *front, *rear; //队头和队尾指针,分别指向头结点和终端结点};template <class T>LiQueue<T>::LiQueue( ){QNode <T> *s;s=new QNode<T>;s->next=NULL;front=rear=s;}template <class T>LiQueue<T>::~LiQueue( ){QNode <T> *p;while(front){p=front;front=front->next;delete p;}}template <class T>void LiQueue<T>::EnQueue(T x){QNode<T> *s;s=new QNode<T>;s->data=x; //申请一个数据域为x的结点ss->next=NULL;rear->next=s; //将结点s插入到队尾rear=s;}template <class T>T LiQueue<T>::DeQueue(){QNode <T> *p; int x;if (rear==front) throw "下溢";p=front->next;x=p->data; //暂存队头元素front->next=p->next; //将队头元素所在结点摘链if (p->next==NULL) rear=front; //判断出队前队列长度是否为1delete p;return x;}template <class T>T LiQueue<T>::GetFront(){if (rear!=front)return front->next->data;}template <class T>T LiQueue<T>::GetRear(){if(rear!=front)return rear->data;}template <class T>bool LiQueue<T>::Empty( ){if(front==rear) return 0;else return 1;}class Train{private :int n,k,th;public :Train();void ChongPai();};Train::Train(){cout<<"请输入火车(货运列车)的车厢个数为:"<<endl;cin>>n;cout<<"请输入转轨站的缓冲轨个数为:"<<endl;cin>>k;}void Train::ChongPai(){int a[MS];LiQueue<int>*b;b=new LiQueue<int>[k+2];cout<<"请输入车厢入轨编号次序:"<<endl;for(int i=0;i<n;i++)cin>>a[i];for(i=n-1;i>=0;i--)b[k].EnQueue(a[i]);cout<<"则进行车厢重排过程如下:"<<endl;th=1;while(b[k].Empty()){int xx=b[k].DeQueue();if(xx==th){cout<<th<<"号车厢直接移至出轨"<<endl;b[k+1].EnQueue(th);th++;int j=0;while(b[j].Empty()){int x=b[j].GetFront();if(x==th){cout<<x<<"号车厢从"<<j+1<<"号缓冲轨出轨"<<endl;b[j].DeQueue();b[k+1].EnQueue(x);j=0;th++;}elsej++;}continue;}else{int j=0,u=5;while(b[j].Empty()&&j<k){if(xx<b[j].GetRear())j++;else{cout<<xx<<"号车厢移至"<<j+1<<"号缓冲轨"<<endl;b[j].EnQueue(xx);u=1;break;}}if(u==5&&j<k){cout<<xx<<"号车厢移至"<<j+1<<"号缓冲轨"<<endl;b[j].EnQueue(xx);}if(j==k-1){cout<<"\n缓冲轨不够,重排车厢失败\n";return;}}}cout<<"车厢依次出轨的编号为:";while(b[k+1].Empty())cout<<b[k+1].DeQueue()<<" ";cout<<endl;}void main(){Train a;a.ChongPai();}五、测试用例1.当有9个火车车厢,3个缓冲轨道时,运行结果如下:2. 当有12个火车车厢,3个缓冲轨道时,运行结果如下:3. 当有12个火车车厢,5个缓冲轨道,运行结果如下:4. 当有12个火车车厢,7个缓冲轨道时,运行结果如下:几次测试都表明试验设计的正确性。

车厢重排问题实验报告

车厢重排问题实验报告

实验报告1.实验要求利用队列结构实现车厢重排问题。

车厢重排问题如下:一列货车共有n节车厢,每个车厢都有自己的编号,编号范围从1~n。

给定任意次序的车厢,的车厢编号。

提示:一列火车的每个车厢按顺序从入轨进入不同缓冲轨,缓冲轨重排后的进入出轨,重新编排成一列货车。

比如:编号为3的车厢进入缓冲轨1,则下一个编号小于3的车厢则必须进入下一个缓冲轨2,而编号大于3的车厢则进入缓冲轨1,排在3号车厢的后面,这样,出轨的时候才可以按照从小到大的顺序重新编排。

2. 程序分析2.1 存储结构本程序采用单链表结构,具体为链队列结构,使用队列结构的先进先出原则可以较好地处理车厢重排问题。

链队列结构示意图如下:2.2 关键算法分析一、本程序的关键算法主要为处理车厢重排问题的函数TrainPermute(),其伪代码如下:void TrainPermute():1. 初始化条件:计数器i=0,与非门aa=12. 判断是否能入轨while(用i<n判断是否n节车厢都入缓冲轨)&&(用aa=1判断是否有合适的缓冲轨可入)2.1将aa置空;2.2用for循环,依次取入入轨中的每一个车厢的编号进入合适的缓冲轨;2.2.1如果缓冲轨中尾指针比进入缓冲轨元素小,则进入该缓冲轨;计数器i+1;有合适缓冲轨,将aa变为真;跳出for循环并进入while循环;2.2.2如果缓冲轨中第一个元素为空,则进入缓冲轨成为第一个元素;计数器i+1;有合适缓冲轨,将aa变为真;跳出for循环并进入while循环;2.3 用aa判断是否有进入合适的缓冲轨2.3.1 aa=0即没有合适的缓冲轨,则输出无法排列;2.3.2 aa=1即有合适的缓冲轨,则2.3.2.1遍历缓冲轨,输出每个缓冲轨按顺序存储的车厢;2.3.2.2 按从小到大的顺序出轨for(引入输出轨计数器newOut=1;newOut<n; newOut+1;)newOut与每个队列的头元素比较若相等,则元素出队;输出显示;具体代码如下:void TrainPermute(int arr[],LinkQueue<int> a[],int n,int k){int i=0;bool aa=1;while((i<n)&&(aa)) //当入轨中有车厢时{for(int m=0;m<k;m++){if(a[m].GetRear()<arr[i]){a[m].EnQueue(arr[i]);i++;}if(a[m].front->next==NULL){a[m].EnQueue(arr[i]);aa=1;i++;break;}}}if(aa==0) //当无法将入轨中队头车厢移至合适缓冲轨中时,程序结束{cout<<"车厢无法重排,算法结束"<<endl;}else //当入轨中已经没有车厢时{for(int m=0;m<k;m++){cout<<"第"<<(m+1)<<"个缓冲轨的列车编号";a[m].Trans();cout<<endl;}cout<<"火车车厢出轨顺序为:"<<endl;for(int newOut=1;newOut<=n;newOut++){for(int j=0;j<k;j++) //扫描缓冲轨,将其队头元素依次由小到大输出{if(a[j].GetFront()==newOut){cout<<a[j].DeQueue()<<" ";}}}}}二、主函数伪代码如下:1. 输入n与k值,若输入值错误,则程序结束;2. 通过循环结构为数组array[]赋值,具体分析见代码;3. 输出入轨中火车车厢号码排列;4. 调用TrainPermute()函数;三、为array[]随机赋值的基本思想为:设置计数器count=0,设置数组ifmark[]来标记array[]赋值情况,依次将1至n等n个数随机赋给array[],其中,若array[t]未被赋值,即ifmark[t]=0,则将值赋给array[t],计数器加一;若array[t]已被赋值,即ifmark[t]=1,则重新开始循环。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
DeQueue(H[j],front);
EnQueue(Outqueue,front);
printf("缓冲区H[%d]头元素%d————>出轨队列\n",j,front);
nextout++;
break;}}
}
}
(3)输出
printf("出轨顺序:");
while(!QueueEmpty(Outqueue))
{DeQueue(Outqueue,a);
printf("%d ",a); }
四、界面设计
程序包含输入提示功能

还有输入报错
五、运行测试与分析
(1)运行程序,显示提示,
(2)输入入轨顺序
(3)数据结果输出
六、实验收获与思考
通过本次实验,熟练掌握了构建队列及相关操作函数的操作。

关于火车重排
#include"stdio.h"
#include "stdlib.h"
#define MAXSIZE 1000
#define N 7
typedef struct {
int *base;//初始化动态分配空间
int front;//头指针
int rear;//尾指针
}SqQueue;
int InitQueue(SqQueue &Q){
Q.base=(int *)malloc(MAXSIZE*sizeof(int));
if(!Q.base) exit(-2);
Q.front=Q.rear=0;
return 1;}
int DestroyQueue(SqQueue &Q){//销毁队列
free(Q.base);
return 1;}
int QueueEmpty(SqQueue Q){//判断队空
return (Q.front-Q.rear)%100==0 ? 1: 0;}
int Getfront(SqQueue Q ,int &front){//读取队头元素if(QueueEmpty(Q)) exit(0);
front=Q.base[Q.front];
return 1;}
int Getrear(SqQueue Q,int &rear){//读取队尾元素if(QueueEmpty(Q)) exit(0);
rear=Q.base[Q.rear-1];
return 1;}
int EnQueue(SqQueue &Q,int &e){//入队
if((Q.rear+1)%MAXSIZE==Q.front) exit(-2);
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return 1;}
int DeQueue(SqQueue &Q,int &e){//出队
if(Q.front==Q.rear) exit(0);
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return 1;}
int main(){
SqQueue H[N],Inqueue,Outqueue;
int i,j,a,b,k,nextout,n,front;
InitQueue(Inqueue);
InitQueue(Outqueue);
for(i=0;i<N;i++)//初始化缓冲队列
InitQueue(H[i]);i=1;
printf("输入车厢总数N: ");
scanf("%d",&k);
while(k<=0||k>N){printf("车厢数不得超过指定值7 请重新输入: ");
scanf("%d",&k); }
printf("输入车厢入轨顺序R: ");
while(i<=k){
scanf("%d",&a);
EnQueue(Inqueue,a); i++;}
i=0;j=0;nextout=1;
while(nextout<=k){//循环出轨
if(!QueueEmpty(Inqueue))
{DeQueue(Inqueue,a);//入轨队列非空,将入轨头元素出队
if(a==nextout) {//入轨头元素等于标记元素,将该元素入到出轨队列
EnQueue(Outqueue,a);
printf("入轨队列头元素%d————>出轨队列\n",a);
nextout++;}
else { //该操作完成将入轨对头元素入到缓冲区队列
b=0;j=0;int r[N]={0};
for(i=0;i<N;i++){
if(!QueueEmpty(H[i])){
Getrear(H[i],r[i]);}}
for(i=0;i<N;i++){
if(b<r[i]&&r[i]<a) {b=r[i];j=i;}}
if(b!=0) {EnQueue(H[j],a);//如果入轨头元素大于缓冲区对列最大尾元素,入队
printf("入轨队列头元素%d————>缓冲区队列H[%d]\n",a,j);}
else {//寻找空的缓冲区队列,并入队。

for(i=0;i<N;i++){
if(QueueEmpty(H[i])) {EnQueue(H[i],a);
printf("入轨队列头元素%d-->缓冲区队列H[%d]\n",a,i);break;}} if(i>=N){
printf("connot arrange!!"); break;} }}} //如果没有空的缓冲区对列,输出cannot arrange
for(j=0;j<N;j++){ if(!QueueEmpty(H[j])) {Getfront(H[j],front);
if(front==nextout){
DeQueue(H[j],front);
EnQueue(Outqueue,front);
printf("缓冲区H[%d]头元素%d————>出轨队列\n",j,front);
nextout++;
break;}}}}
printf("出轨顺序:");
while(!QueueEmpty(Outqueue)){//出队的顺序DeQueue(Outqueue,a);
printf("%d ",a); }
for(i=0;i<N;i++)
DestroyQueue(H[i]);
DestroyQueue(Inqueue);
DestroyQueue(Outqueue);
system("pause");
return 0;}。

相关文档
最新文档