①问题描述

一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1~n,即货运列车按照第n站至第1站的次序经过这些车站。为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同,这样,在每个车站只要卸掉最后一节车厢。所以,给定任意次序的车厢,必须重新排列它们。

车厢的重排工作可以通过转轨站完成。在转轨站中有一个入轨、一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间。假定缓冲轨按先进先出的方式运作,设计算法解决火车车厢重排问题。

②基本要求

设计存储结构表示n个车厢、k个缓冲轨以及入轨和出轨;

设计并实现车厢重排算法;

分析算法的时间性能。

③设计思想

假设有3个缓冲轨,入轨中有9节车厢,次序为5,8,1,7,4,2,9,6,3,重排后,9节车厢出轨次序为9,8,7,6,5,4,3,2,1。重排过程如下:

3号车厢不能直接移至出轨(因为1号车厢和2号车厢必须排在3号车厢之前),因此,把3号车厢移至H1。6号车厢可放在H1中3号车厢之后(因为6号车厢将在3号车厢之后出轨)。9号车厢可以继续放在H1中6号车厢之后,而接下来的2号车厢不能放在9号车厢之后(因为2号车厢必须在9号车厢之前出轨)。因此,应把2号车厢移至H2,4号车厢可以放在H2中2号车厢之后,7号车厢可以继续放在4号车厢之后,如图4所示。至此,1号车厢可通过H3直接移至出轨,如图5所示。由于5号车厢此时仍在入轨中,所以把8号车厢移动至H2,这样就可以把5号车厢直接从入轨移至出轨,如图6所示。此后,可依次从缓冲轨中移出6号、7号、8号和9号车厢,如图7所示。

图4将369、247依次入缓冲轨

图5将1移至出轨,234移至出轨

图6将8入缓冲轨,5移至出轨

图7将6789移至出轨

由上述重排过程可知:在把车厢c移至缓冲轨时,车厢c应移动到这样的缓冲轨中:该缓冲轨中队尾车厢的编号小于c;如果有多个缓冲轨满足这一条件,则选择队尾车厢编号最大的缓冲轨;否则选择一个空的缓冲轨。

⑤思考

如果缓冲轨按后进先出的方式工作,即用栈表示缓冲轨,应如何解决火车车厢重排问题?

#include

using namespace std;

class Queue

{

public:

struct Node

{

int data;

Node * next;

Node():next(NULL) {}

Node(int a):data(a),next(NULL) {}

};

Node * Front;

Node * rear;

int length;

Queue()

{

Node * p = new Node();

Front = p;

rear = p;

length = 0;

}

int inQueue(int a)

{

Node * p = new Node(a);

rear -> next = p;

rear = rear -> next;

length ++;

}

int showrear()

{

return rear->data;

}

int showfront()

{

return Front->next->data;

}

void outQueue()

{

Node * p = Front -> next;

Front -> next = p -> next;

delete p;

length--;

}

void printf()

{

Node * p = Front -> next;

for(int i = 0 ; i < length ; i++)

{

cout<data<

p = p -> next;

}

}

bool isEmpty()

{

return length == 0;

}

};

int main()

{

int n , k ;//n代表车厢数,k代表轨道

int nowOut = 1;//要输出的车厢编号

cout<

cout<

cout<

cin>>n>>k;

Queue dusk[k+2];//0到k-1代表缓冲轨道,k代表入轨,k+1代表出轨

for(int i = 0 ; i < n ; i++)//输入入队车厢号

{

int a ;

cin>>a;

dusk[k].inQueue(a);

}

while(!dusk[k].isEmpty())//出轨不为空的时候循环

{

int flag = 0;//判断进入新的缓冲轨还是进入非空缓冲轨道。

//0进入新的缓冲轨道,非0进入非空缓冲轨道

int z = 0;//判断是否能直接出轨。0为不能直接出轨,非0为可出轨。

int flag_end = 0;//退出循环判定

if(dusk[k].showfront()==nowOut)//如果出轨队头车厢号等于现在要出轨的车厢号

{

for(int i = 0 ; i < k ; i++)//遍历所有循环轨,找出一个空的

{

if(dusk[i].isEmpty())//找到空的循环轨,输出

{

cout<

dusk[k+1].inQueue(dusk[k].showfront());

nowOut++;

dusk[k].outQueue();

z++;

flag++;

break;

}

}

}

if(z==0)//如果不能直接出轨,找到比当前要出轨的车厢小的非空轨道,并入轨

{

for(int i = 0 ; i < k ; i++)

{

if(!dusk[i].isEmpty()&&(dusk[i].showrear()

{

cout<

dusk[i].inQueue(dusk[k].showfront());

dusk[k].outQueue();

flag ++;

break;

}

}

}

//如果找不到比当前要出轨的车厢小的非空轨道,就找空的缓冲轨,并入轨

if(flag == 0)

{

for(int i = 0 ; i < k ; i++)

{

if(dusk[i].isEmpty())

{

cout<

dusk[i].inQueue(dusk[k].showfront());

dusk[k].outQueue();

break;

}

if(i==k-1)//如果找不到新的缓冲轨,那么输出ERROR,结束循环

{

cout<

flag_end = 1;//结束循环的标志

break;

}

}

}

if(flag_end == 1)//退出while循环

{

break;

}

//遍历所有非空轨道队头车厢号,如果等于要出队的车厢号,就出轨并且重新循环

for(int i = 0 ; i < k ; i++)

{

if(!dusk[i].isEmpty()&&dusk[i].showfront()==nowOut)

{

cout<

dusk[k+1].inQueue(dusk[i].showfront());

dusk[i].outQueue();

nowOut++;

i = -1;

}

}

}

dusk[k+1].printf();//打印出轨车厢顺序

}

java队列火车厢重排_火车车厢重排问题--队列模拟相关推荐

  1. java队列火车厢重排_火车车厢重排(链队列)

    1.题目: Problem Description 一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号分别为1~n,即货运列车按照第n站至第1站的次序经过这些车站.为了便于从列车 ...

  2. java队列火车厢重排_火车车厢重排问题

    1 #include 2 #include 3 usingstd::stack;4 usingstd::cin;5 usingstd::cout;6 7 const int MAX = 100; // ...

  3. java队列火车厢重排_火车车厢重排——队列实现

    其实队列和栈挺像的,所以也就没有单独写一个实现队列的笔记,可以参考一下栈的实现:https://www.cnblogs.com/2015-16/p/12957964.html    (同时这一篇也包含 ...

  4. java都界面相对布局_浏览器的重排和重绘

    浏览器的高层结构 1.用户界面 - 包括地址栏.前进/后退按钮.书签菜单等. 2.浏览器引擎 - 在用户界面和呈现引擎之间传送指令. 3.渲染引擎 - 负责显示请求的内容. 4.网络 - 用于网络调用 ...

  5. Java老鼠走迷宫流程图_老鼠走迷宫(队列实现)

    1.[文件] Game.cpp ~ 2KB 下载(134) // Game.cpp: implementation of the Game class. // // #include "Ga ...

  6. 队列处理高并发_高并发架构消息队列面试题解析

    面试题 为什么使用消息队列? 消息队列有什么优点和缺点? Kafka.ActiveMQ.RabbitMQ.RocketMQ 都有什么区别,以及适合哪些场景? 面试官心理分析 其实面试官主要是想看看: ...

  7. 消息队列控制灯代码_代码实现RabbitMQ死信队列的创建

    ‍ ‍前言:‍ ‍ 之前有写过死信队列的使用场景以及通过管控台创建死信.这次就通过代码实现死信队列的创建,同时也分享一下RabbitMQ封装的类. 准备: 1. 先准备一个死信队列(最后用来消费)的参 ...

  8. java数据抽取到数据仓库_关于数据增量抽取的模拟实现——脚本实现

    具体排过版的请参看http://Percywang.itpub.net 本文主要是针对关于数据增量抽取的模拟实现--原理进行实现的 实现的环境: 业务数据库:Oracle9i 数据仓库数据库:SQLS ...

  9. 数据结构-火车车厢重排问题(队列实现)

    问题描述 转轨站示意图如下: 重排过程如下: 伪代码 1. 分别对k个队列初始化: 2. 初始化下一个要输出的车厢编号nowOut = 1; 3. 依次取入轨中的每一个车厢的编号: 3.1 如果入轨中 ...

最新文章

  1. AppStore审核2.1被拒大礼包过审经历
  2. 记录一次爬取某昵称网站的爬虫
  3. 研究了北京的14848条道路,我们竟然发现……
  4. C语言——实现用链表存储学生信息,当输入0退出输入,并查找学号为3的学生是否存在
  5. Work Measurement - 1
  6. 任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36
  7. 百度搜索资源平台添加自己的网站
  8. http和socket之长连接和短连接区别
  9. 微软最强命令行工具 Windows Terminal,强势霸榜GitHub
  10. github 检查代码质量_Android(8): 代码质量检查
  11. Java EE 7中的WebSocket客户端API
  12. oracle忽略除数为0,ora-01476除数为0的解决办法,oracle中decode()的使用
  13. android判断是否json格式,android – 检查JSON中是否存在subObject
  14. 微软允许员工永久在家办公,远程办公时代真的要来临了吗?
  15. c oracle 32位64位,64位与32位编程的数据类型区别(C/C++)
  16. BPM配置故事之案例2-文本默认值
  17. android 气泡尖角边框,如何使用CSS实现一个带尖角的气泡框?
  18. 双光耦开关电源电路图_几种常见开关电源电路图
  19. 这样拆分和压缩css代码
  20. Android面试知识点复习,那些不为人知的秘密

热门文章

  1. Bagging和Boosting的区别
  2. java nvl函数_nvl的简单用法
  3. 爬取12306车票信息(初级版本)
  4. ubuntu 添加用户指定登录shell修改登录shell
  5. NYOJ 61 传纸条
  6. element-two
  7. windows BitLocker解密
  8. 微信小程序自定义组件-树形数据表格(进阶版)
  9. The martian 2015 火星救援百度网盘下载真正可用的。2015-10-11更新
  10. Python百度文库爬虫之txt文件