火车车厢重排问题

合集下载

基于Asp .net、XML与Flash架构的火车车厢重排问题虚拟实验开发

基于Asp .net、XML与Flash架构的火车车厢重排问题虚拟实验开发

基于、XML与Flash架构的火车车厢重排问题虚拟实验开发摘要:当前,XML(Extensible Makeup Language)是跨平台数据结构的最佳选择,应用广泛。

它是一种通用的、跨平台的数据描述方法,相比于一般的记事本文件,完全采用了Unicode 编码和条理清晰的分层标签。

介绍了和Flash之间通过XML文件传递信息解决火车重排堆栈问题。

Flash使抽象的数据结构问题转化为具象的动画呈现给学生,有助于学生理解问题、编写程序。

关键词:XML;;Flash;虚拟实验;火车车厢重排0引言当前,XML是跨平台数据结构的最佳选择。

XML全称为可扩展标记语言(Extensible Makeup Language)。

它是一种通用的、跨平台的数据描述方法,也是未来存储信息的方式,其应用无处不在。

XML是可扩展的、与平台无关的语言,相比于一般记事本文件,它完全采用Unicode 编码和条理清晰的分层标签并且支持国际化。

Flash是专业的动画创作工具,可以开发有吸引力、表现力的用户界面和丰富的应用程序。

它开发的文件数据量小,可以以插件方式工作、“流”形式文件播放以及实时交互。

因此,Flash成功地渗入到网络动画、音乐电视、广告、教学、游戏等多个领域。

是基于通用语言的编译运行程序,其强大的适应性,几乎可以使它运行在Web 应用软件开发者全部的平台上。

通用语言的基本库、消息机制、数据接口的处理都能无缝整合到的Web应用中。

也是languageindependent(语言独立化)的,支持C#(C++和Java的结合体)、VB、Jscript、C++、F++等语言。

与Flash之间传值在中对数据进行处理后,生成XML树,然后通过XML 文件在Flash端接收XML文件,解析XML树后,根据传入的参数进行操作。

<sup>[1]</sup>其通信原理如图1所示。

端生成XML文件的代码如下:System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter (Server.MapPath("./1234.xml"),System.Text.Encoding.UTF8);//声明一个xmlWriter变量用于编写XML文件xmlWriter.Formatting = Formatting.Indented;//用于生成良好的显示格式,增强可读性xmlWriter.WriteStartDocument();xmlWriter.WriteStartElement("数据");//生成一个结点xmlWriter.WriteStartElement("单次");xmlWriter.WriteAttributeString("车厢",firstNum.ToString());//写入节点的属性xmlWriter.WriteAttributeString("铁轨",secondNum.ToString());xmlWriter.WriteAttributeString("出入",thirdNum.ToString());xmlWriter.WriteEndElement();xmlWriter.WriteEndDocument();//写文档结束xmlWriter.Close();//关闭textWriterFlash端接收XML文件的代码如下:var myXML:XML= new XML;var XML_URL:String = "1234.xml";var myXMLURL:URLRequest = new URLRequest(XML_URL);public var myLoader:URLLoader = new URLLoader (myXMLURL);public function Motion(){myLoader.addEventListener("complete",xmlLoaded);}2火车重排堆栈问题动画实现笔者在学习数据结构时发现授课内容比较抽象,需要具体的图解动态地描述问题。

火车车厢重排问题,队列,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.如果输入的序列不是连续自然数。

火车车厢重排问题

火车车厢重排问题

⽕车车厢重排问题2014-11-04主要数据结构:栈题⽬:⼀列⽕车要将n节车厢分别送往n个车站按1~n的次序编号,⽕车按照n,n-1,…1的编号次序经过车站。

假设车厢的编号就是其⽬的地车站的编号。

要求:给定⼀个任意的车厢排列次序。

重新排列车厢,使其按照从1到n的次序排列。

规定重排时,只能从⼊轨到缓冲铁轨,或者从缓冲铁轨到出轨。

总的思路:⾸先:将所需要重排的车厢编号从左到右依次输⼊数组carrage中;然后:对carrage中的元素进⾏从左往右逐个遍历,如果符合下⼀个输出,则直接将其输出,并且遍历所有的缓冲轨道,查找是否有符合下⼀个输出的车厢,有的话便将其输出,否则将其压⼊缓冲轨道未经优化的代码:1 #include <iostream>2 #include <stack>3using namespace std;45 stack<int> stack_final;678void Output(int& minH, int& minS, stack<int> H[], int k, int n) {9// put the car from the strack to the output line, and change the minH and minS10int index; // the index of the car11//delete the minist car number from the minS12 stack_final.push(H[minS].top());13 H[minS].pop();14 cout << "Move car " << minH << "from holding track " << minS << " to output line" << endl;15//serch all the track's top, find the new minH and minS16 minH = n+2;17for (int i= 0; i < k; i++) {18if (!H[i].empty() && (index = H[i].top()) < minH) {19 minH = index;20 minS = i;21 }22 }23 }2425bool Input(int c, int& minH, int& minS, stack<int> H[], int k, int n) {26// put the new car c into the track27// if there is no available track, then return false, else return true28// find the best track for the car c29// initial30int BestTrack = 0; //the best track now31int BestTop = n+1; //the best track's top car32int index; //the index for the car33// search the k track34for (int i= 0; i < k; i++) {35if (!H[i].empty()) {36 index = H[i].top();37if (c < index && index < BestTop) {38//the top car's number is the smallest39 BestTop = index;40 BestTrack = i;41 }42 } else { // the track is empty43if (!BestTrack) {44 BestTrack = i;45 }46 }47 }48if (!BestTrack) {49return false; //there is available track to use50 }51 H[BestTrack].push(c);52 cout << "Move car " << c << "from input to holding track " << BestTrack << endl;53//if it is essencial, then change the minH and minS54if (c < minH) {55 minH = c;56 minS = BestTrack;57 }58return true;59 }6061bool Railroad(int input[], int n, int k) {62//k63// if it resort succed, then return true, else return false64// create the stack according to the k65 stack<int> *H;66 H = new stack<int> [k];67int NowOut = 1; // the next number of car to putout68int minH = n+1; //the minist number car in the k69int minS; //the minist number's strack70// resort the car71for (int i = n-1; i >= 0; i--) {72int number = input[i];73if (number == NowOut) {74 cout << "Move car " << number << " from the input line to the output line\n";75 stack_final.push(number);76 NowOut++;77while (minH == NowOut) {78 Output (minH, minS, H, k, n);79 NowOut++;80 }81 } else {82int end = 0;83for (int j = i; j > 0; j--) {84if (input[j-1] < input[j]) {85 end = j;86break;87 }88 }89for (int j = end; j <= i; j++) {90if (!Input (input[j], minH, minS, H, k, n)) {91return false;92 }93 }94if (end) {95 i = end;96 }97 }98 }99return true;100 }101102int main() {103int n, *input;104 cin >> n;105 input = new int[n];106for (int i = 0; i < n; i++) {107 cin >> input[i];108 }109if (Railroad(input, n, n-1)) {110 cout << "resort succed!\n";111while (!stack_final.empty()) {112 cout << stack_final.top() << "";113 stack_final.pop();114 }115 } else {116 cout << "failed\n";117 }118 }View Code经过优化之后的代码:增加的条件:车厢可以从排在后⾯的缓冲轨道移到前⾯的缓冲轨道。

火车重排问题

火车重排问题

火车车厢重排问题1.1火车车厢重排问题一列货运列车共有n节车厢,每节车厢将停放在不同的车站。

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

车厢编号与他们的目的地一样。

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

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

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

比如:编号为3的车厢进入缓冲轨1,则下一个编号小于3的车厢则必须进入下一个缓冲轨2,而编号大于3的车厢则进入缓冲轨1,排在3号车厢的后面,这样,出轨的时候才可以按照从小到大的顺序重新编排我们在一个转轨站里完成重拍的工作,在转轨站有一个入轨,一个出轨和k个缓冲轨(位于入轨和出轨之间)。

下面的图示就是一个转轨站,其中有3个缓冲轨,H1,H2,H3。

(PPT中有动态演示)1.3算法描述:那么缓冲轨就不是FILO 而是FIFO了那么就要用队列来实现车厢重排了,算法的描述和栈实现的基本一样的,只是OutPut和Hold 函数改了一下,将一截车厢移动到缓冲轨时,车厢c应该移动到这样的缓冲轨中:该缓冲轨中现有各车厢的编号均小于c,如果有多个缓冲轨都满足这一条件,那么选择其中左端车厢编号最大的那个缓冲轨,否则选择一个空的缓冲轨(如果存在的话)1.4代码:#include<iostream>#include<stack>usingnamespace std;template<class T>void PrintfNum(T a[], constint& n);// move cars from holding track to output trackvoid OutPut(stack<int> t[],int n, int totalStack,int& min){//move car from holding trackfor(int x = 0;x <totalStack; ++x){if(!t[x].empty() && t[x].top() == min){cout<<"Move car "<< t[x].top() <<" from holding track "<< x <<" to output"<<endl;t[x].pop();++min;x = -1; // find next car from the first holding track 0}}}// move cars from input track to holding trackbool Hold(stack<int> t[],int n , int totalStack){for(int i = 0;i <totalStack; ++i){if(t[i].empty() || (!t[i].empty() && t[i].top() > n)){cout<<"holding track "<<i<<" hold car "<< n <<endl;t[i].push(n);returntrue; // we already find a holding track, so break the loop. }}returnfalse;}int main(int argc, char* argv[]){constint NUM = 9;constint STACKNUM = 3;stack<int> t[STACKNUM];int min = 1;int a[NUM] = {5,8,1,7,4,2,9,6,3};PrintfNum(a,NUM);for(int i = NUM - 1; i>= 0; --i){if(a[i] == min){// try to move cars from input track or holding track cout<<"Move car "<< a[i] <<" from input to output"<<endl;++min;OutPut(t,a[i],STACKNUM,min);}else{// move cars from input track to holding trackif(!Hold(t,a[i],STACKNUM)){cout<<"Not enough holding track"<<endl;break;}}} getchar();return 0;}template<class T>void PrintfNum(T a[], constint& n){for(int i = 0; i< n; ++i){cout<< a[i] <<",";}cout<<endl;}1.5火车车厢重排问题决策过程H1H2H31.5.1初始数组H1 H2 H31.5.2H1H2H3H1 H2 H3H1 H2 H3H1 H2 H3H1 H2 H3H1 H2 H3H1H2 H3H1 H2 H3H1 H2 H3H1 H2 H3H1 H2 H3 1.6程序运行截图。

火车车厢重排问题,队列,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. ```。

基于Asp.net、XML与Flash架构的火车车厢重排问题虚拟实验开发

基于Asp.net、XML与Flash架构的火车车厢重排问题虚拟实验开发
第1 2 卷 第1 0 期
2 0 1 3 1 o ) q
软 件 导 刊
So f t wa r e Gui d e
Vo1 .1 2N0.1 O Oc t .2 01 3
基 于 As p . n e t 、 XM L与 F l a s h架 构 的 火 车 车 厢 重 排 问 题 虚 拟 实 验 开 发
x ml Wr i t e r . Wr i t e S t a r t E l e me n t ( ” 数据 ” ) ; / / 生 成 一 个 结 点
x ml Wr i t e r . Wr i t e S t a r t El e me n t ( ” 单 次” ) ; x ml Wr i t e r . Wr i t e At t r i h u t e S t r i n g(” 车 厢 t r i n g( ) );/ / 写 入 节 点 的属 性
交 互 。因 此 , F l a s h成 功 地 渗 入 到 网 络 动 画 、 音 乐 电视 、 广 告、 教学 、 游戏等多个领域 下 :
S y s t e m. Xm 1 . Xml Te x t Wr i t e r x ml Wr i t e r— n e w Xml Te x t —
给学生 , 有 助 于 学 生理 解 问题 、 编写程序 。
关键 词 : XMI ; As p . n e t ; F l a s h ; 虚 拟 实验 ; 火 车 车 厢 重 排
中图分类号 : TP 3 1 1
文献 标 识 码 : A
文章编号 : 1 6 7 2 — 7 8 0 0 ( 2 0 1 3 ) 0 0 1 0 — 0 l 1 4 — 0 3

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

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

火车车厢重排问题栈c语言火车车厢重排问题是一个经典的问题,考验了数据结构和算法的运用。

这个问题可以很好地帮助我们了解如何使用栈这种数据结构来解决实际问题,并且可以通过编写C语言程序对其进行求解。

在本文中,我们将深入探讨火车车厢重排问题,并编写C语言程序实现问题的求解。

首先,让我们来了解一下火车车厢重排问题的具体描述。

假设有一列火车车厢按照编号从1到n的顺序排列在轨道上。

现在我们需要将这些车厢按照特定的顺序重新排列,给定一个目标排列,我们需要找出一种排列车厢的方法,使得最终的排列符合目标排列。

具体而言,对于每一个车厢,我们可以将其从原来的位置移动到一个临时的缓冲轨道中,然后再将其移动到目标位置。

这个问题的关键在于如何确定每个车厢应该如何移动才能满足最终的目标排列。

为了解决这个问题,我们可以使用栈这种数据结构来辅助实现。

栈是一种先进后出的数据结构,这样的特性非常适合用来模拟火车车厢的重排过程。

具体而言,我们可以将原始轨道上的车厢编号序列作为输入,然后使用栈来模拟车辆的移动过程,最终得到目标排列。

下面我们将通过C语言程序来实现这个过程。

首先,我们需要定义一个栈的数据结构,来模拟车厢的移动过程。

我们可以使用数组来实现这个栈,同时需要定义一个栈顶指针来表示当前栈顶元素的位置。

另外,我们还需要定义一个函数来模拟入栈和出栈的过程。

接下来,让我们来具体实现这个栈的数据结构和相关的函数。

```c#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;} Stack;void init(Stack *s) {s->top = -1;}void push(Stack *s, int value) { if (s->top < MAX_SIZE - 1) {s->top++;s->data[s->top] = value;} else {printf("Stack overflow\n");}}int pop(Stack *s) {if (s->top >= 0) {int value = s->data[s->top];s->top--;return value;} else {printf("Stack underflow\n"); return -1;}}int main() {Stack s;init(&s);//对栈进行入栈和出栈操作push(&s, 1);push(&s, 2);push(&s, 3);printf("%d\n", pop(&s)); //输出3printf("%d\n", pop(&s)); //输出2printf("%d\n", pop(&s)); //输出1printf("%d\n", pop(&s)); //输出Stack underflow,表示栈已空return 0;}```在这段代码中,我们定义了一个栈的数据结构,并实现了栈的初始化、入栈和出栈操作。

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

火车车厢重排问题源程序代码
#include<iostream.h>
#include<stdlib.h>
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front; // 头指针,若队列不空,指向队列头元素
QueuePtr rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
} LinkQueue;
int InitQueue (LinkQueue &Q)// 构造一个空队列Q
{
Q.front = Q.rear = (QueuePtr) malloc (sizeof (QNode));
if (!Q.front) return 0; // 存储分配失败
Q.front->next=NULL;
return 1;
}
int EnQueue (LinkQueue &Q, int e) // 插入元素e为Q的新的队尾元素{
QueuePtr p;
p=(QueuePtr) malloc (sizeof (QNode));
if(!p) return 0; //队列满
p->data=e; p->next =NULL;
Q.rear->next =p;
Q.rear =p;
return 1;
}
int DeQueue (LinkQueue &Q) // 若队列不空,则删除Q的队头元素,用e 返回其值,并返回1; 否则返回0
{
QueuePtr p;
if (Q.front == Q.rear) return 0;
else
{
p=Q.front->next;
Q.front->next=p->next;
if(p->next==NULL)
Q.front=Q.rear;
int m=p->data;
free(p);
return m;
}
}
int Getfront(LinkQueue &Q)//取队头元素
{
if(Q.front==Q.rear) return 0;
else
return Q.front->next->data;
}
int Getrear(LinkQueue &Q)//取队尾元素
{
if(Q.front==Q.rear) return 0;
else
return Q.rear->data;
}
int IsEmpty(LinkQueue &Q)//判断队列为空
{
if (Q.front == Q.rear)
return 0;
return 1;
}
void Resort(LinkQueue &Q,LinkQueue *H,int k)//火车车厢重排{
int nowOut=1,no=1;
while(nowOut<10)
{
int flag=0,flag2=0;//车厢出轨标记初始化为0
int c=DeQueue(Q);
if(c==nowOut)
{
cout<<c<<" ";nowOut++;flag=1;
}
for(int j=0;j<k;j++)//输出对头元素
{
if(IsEmpty(H[j]))
{
if(Getfront(H[j])==nowOut)
{
int m=DeQueue(H[j]);
cout<<m<<" ";nowOut++; j=0;flag=1;
}
}
}
if(flag==0)//插入新的缓冲队列
{
for(int i=0;i<k;i++)
{
if(IsEmpty(H[i]))
{
int n=Getrear(H[i]);
if(c>n)
{
EnQueue(H[i],c);flag2=1;break;
}
}
}
if(flag2==0)
{
if(no==k)
{
cout<<"缓冲队列已用完,无法输出"<<endl;break;
}
else
{
EnQueue(H[no],c);no++;
}
}
}
}
}
void main()
{
LinkQueue Q,H[9];
int k,a[9];
InitQueue(Q);
cout<<"请输入你需要的缓冲队列个数:";
cin>>k;
for(int i=0;i<k;i++)
InitQueue(H[i]);
cout<<"请输入火车入轨的编号序列:";
for(int j=0;j<9;j++)
{
cin>>a[j]; EnQueue(Q,a[j]);
}
cout<<"火车车厢重排序列为:";
Resort(Q,H,k);
cout<<endl;
}。

相关文档
最新文档