博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构C++ 队列——队列的应用
阅读量:6236 次
发布时间:2019-06-22

本文共 10369 字,大约阅读时间需要 34 分钟。

application.h :

1 #pragma once2 #include "mach.h"3 4 //列车车厢重排5 bool Arrange(int order[], int ordered[], int carNum, int stackNum);6 7 //工厂仿真8 void machineSimulate();
mach.h :
1 #pragma once  2 #include "vectorQueue.h"  3 #include "myExceptions.h"  4   5   6 #define DEBUG_INFO 1  7   8 /******************************************************  9 *                        工序 10 ******************************************************/ 11 struct task 12 { 13     int machine;    //执行该工序的机器 14     int time;        //完成该该工序所需的时间 15  16     task(int theMachine = 0, int theTime = 0) 17     { 18         machine = theMachine; 19         time = theTime; 20     } 21 }; 22  23 /****************************************************** 24 *                        任务 25 ******************************************************/ 26 struct job 27 { 28     vectorQueue
taskQ; // 任务的工序 29 int length; // 被调度的工序时间之和 30 int arrivalTime; // 到达当前队列的时间 31 int id; // 任务标志 32 33 job(int theId = 0) 34 { 35 id = theId; 36 length = 0; 37 arrivalTime = 0; 38 } 39 40 void addTask(int theMachine, int theTime) 41 { 42 task theTask(theMachine, theTime); 43 taskQ.push(theTask); 44 } 45 46 //删除任务的下一道工序,并返回时间 47 int removeNextTask() 48 { 49 int theTime = taskQ.front().time; 50 taskQ.pop(); 51 length += theTime; 52 return theTime; 53 } 54 }; 55 56 /****************************************************** 57 * 机器 58 ******************************************************/ 59 struct machine 60 { 61 vectorQueue
jobQ; // 机器的等待处理任务队列 62 int changeTime; // 机器的转换状态所用时间 63 int totalWait; // 空闲时间 64 int numTasks; // 机器处理的工序数量 65 job* activeJob; // 机器当前正在处理的任务 66 67 machine() 68 { 69 totalWait = 0; 70 numTasks = 0; 71 activeJob = NULL; 72 } 73 }; 74 75 76 /****************************************************** 77 * 事件表 78 ******************************************************/ 79 class eventList 80 { 81 public: 82 eventList(int theNumMachines, int theLargeTime) 83 { 84 if (theNumMachines < 1) 85 throw illegalParameterValue 86 ("number of machines must be >= 1"); 87 numMachines = theNumMachines; 88 finishTime = new int[numMachines + 1]; 89 90 // 初始时间,所有机器都空闲 91 for (int i = 1; i <= numMachines; i++) 92 finishTime[i] = theLargeTime; 93 } 94 95 //处理下一项工序的机器 96 int nextEventMachine() 97 { 98 int p = 1; 99 int t = finishTime[1];100 //搜索最早完成的机器101 for (int i = 2; i <= numMachines; i++)102 if (finishTime[i] < t)103 {104 p = i;105 t = finishTime[i];106 }107 return p;108 }109 110 //下一项工序的完成时间111 int nextEventTime(int theMachine)112 {113 return finishTime[theMachine];114 }115 116 void setFinishTime(int theMachine, int theTime)117 {118 finishTime[theMachine] = theTime;119 }120 private:121 int* finishTime; // 完成时间数组122 int numMachines; // 机器的数量123 };

application.c pp:

1 #include 
2 #include "vectorQueue.h" 3 #include "application.h" 4 5 6 /******************************************************************************************* 7 * 列车车厢重排 8 *******************************************************************************************/ 9 10 int minCar; //缓冲轨道上编号最小的车厢 11 int minCarInStack; //缓冲轨道上编号最小的车厢所在的轨道号 12 13 bool fromOrderToQueue(int car, vectorQueue
* &Queue, int queueNum, int carNum) 14 { 15 int bestStack = -1, bestTop = 0; 16 for (int i = 0; i < queueNum; i++) //轨道为空 17 { 18 if (Queue[i].empty()) 19 { 20 if (bestStack == -1) 21 bestStack = i; 22 } 23 else //轨道不为空 24 { 25 int QueueTop = Queue[i].back(); 26 if (car > QueueTop && QueueTop > bestTop) 27 { 28 bestTop = QueueTop; 29 bestStack = i; 30 } 31 } 32 } 33 34 if (-1 == bestStack) 35 return false; 36 std::cout << "移动" << car << "号车厢到" << bestStack << "号缓冲轨道" << std::endl; 37 Queue[bestStack].push(car); //车厢放入最合适的缓冲轨道内 38 if (car < minCar) //更新变量 39 { 40 minCar = car; 41 minCarInStack = bestStack; 42 } 43 44 return true; 45 } 46 47 void fromQueueToOrdered(vectorQueue
* &Queue, int queueNum, int ordered[], int &nextCar, int carNum) 48 { 49 // std::cout << "nextCar = " << nextCar << std::endl; 50 int QueueTop = Queue[minCarInStack].front(); 51 Queue[minCarInStack].pop(); 52 ordered[nextCar - 1] = QueueTop; 53 std::cout << "移动" << minCarInStack<<"缓冲轨道的"<< QueueTop <<"号车厢到出轨道"<< std::endl; 54 // nextCar++; 55 56 minCar = carNum + 1; 57 for (int i = 0; i < queueNum; i++) 58 { 59 if (!Queue[i].empty() && Queue[i].front() < minCar) 60 { 61 minCar = Queue[i].front(); 62 minCarInStack = i; 63 } 64 } 65 // std::cout << "minCar = " << minCar << std::endl; 66 } 67 68 bool Arrange(int order[], int ordered[], int carNum, int queueNum) 69 { 70 vectorQueue
*Queue = new vectorQueue
[queueNum - 1]; 71 72 int nextCar = 1; //下一个该几号车厢 73 minCar = carNum + 1; 74 for (int i = 0; i < carNum; i++) 75 { 76 if (order[i] == nextCar) //直接放到出轨道 { 9,5,7,3,2,8,4,1,6 }; 77 { 78 ordered[nextCar - 1] = order[i]; 79 std::cout << "移动" << order[i] << "号车厢到出轨道"<
setFinishTime(theMachine, largeTime);144 145 info << "且没有等待被执行的任务";146 }147 else //取出队首的任务并开始执行148 {149 int id = mArray[theMachine].jobQ.front()->id;150 int Mac = mArray[theMachine].jobQ.front()->taskQ.front().machine;151 int time = mArray[theMachine].jobQ.front()->taskQ.front().time;152 153 mArray[theMachine].activeJob = mArray[theMachine].jobQ.front();154 mArray[theMachine].jobQ.pop();155 mArray[theMachine].totalWait += timeNow - mArray[theMachine].activeJob->arrivalTime;156 mArray[theMachine].numTasks++;157 int t = mArray[theMachine].activeJob->removeNextTask();158 eList->setFinishTime(theMachine, timeNow + t);159 160 info << ",有等待被执行的" << id << "号任务在 " << Mac << "机器上执行 " << time;161 }162 }163 else //刚完成了一项任务164 {165 // 设置转换时间166 lastJob = mArray[theMachine].activeJob;167 mArray[theMachine].activeJob = NULL;168 eList->setFinishTime(theMachine, timeNow + mArray[theMachine].changeTime);169 170 info << "刚执行完第" << lastJob->id << "号任务";171 }172 173 debug_info(info.str());174 // 返回 theMachine 刚完成的任务175 return lastJob;176 }177 178 //将任务移动到下一项任务所需的机器上179 bool moveToNextMachine(job* theJob)180 {181 if (theJob->taskQ.empty()) //任务已完成,返回false182 {183 std::cout << "第" << theJob->id << "号任务在 "184 << timeNow << " 时间完成,等待 " << (timeNow - theJob->length) 185 <
id << " 号任务调度到" << theJob->taskQ.front().machine192 <<"号机器";193 debug_info(info.str());194 195 // 执行下一项任务的机器196 int p = theJob->taskQ.front().machine;197 // 将任务添加到该机器的等待队列中198 mArray[p].jobQ.push(theJob);199 theJob->arrivalTime = timeNow;200 // 如果该机器空闲,则改变其状态为 活动201 if (eList->nextEventTime(p) == largeTime)202 changeState(p);203 204 return true;205 }206 }207 208 //获取机器和任务数据209 void getMachineAndJob()210 {211 std::cout << "输入机器数量和任务数量:" << std::endl;212 std::cin >> numMachines >> numJobs;213 if (numMachines < 1 || numJobs < 1)214 throw illegalInputData("机器数量和任务数量必须 >= 1");215 216 // 生成任务和机器队列217 eList = new eventList(numMachines, largeTime);218 mArray = new machine[numMachines + 1];219 220 // 输入状态转换时间221 int ct;222 for (int j = 1; j <= numMachines; j++)223 {224 std::cout << "输入"<
<<"号机器状态转换时间:" << std::endl;225 std::cin >> ct;226 if (ct < 0)227 throw illegalInputData("状态转换时间必须 >= 0");228 mArray[j].changeTime = ct;229 }230 231 // 输入任务232 job* theJob;233 int numTasks, firstMachine, theMachine, theTaskTime;234 for (int i = 1; i <= numJobs; i++)235 {236 std::cout << "输入"<< i<<"号任务的工序数量:" << i << std::endl;237 std::cin >> numTasks;238 firstMachine = 0; // machine for first task239 if (numTasks < 1)240 throw illegalInputData("任务的工序数量必须 > 1");241 242 // 创建任务243 theJob = new job(i);244 for (int j = 1; j <= numTasks; j++)245 {246 std::cout << "输入" << i << "号任务"<
<<"号工序(机器编号,执行时间):" << std::endl;247 // 读取任务i的工序248 std::cin >> theMachine >> theTaskTime;249 if (theMachine < 1 || theMachine > numMachines250 || theTaskTime < 1)251 throw illegalInputData("机器编号 或 执行时间 错误");252 if (j == 1)253 firstMachine = theMachine; // 第一道工序所需要的机器254 theJob->addTask(theMachine, theTaskTime); // 添加到工序队列255 }256 mArray[firstMachine].jobQ.push(theJob);257 }258 }259 260 //初始化,填装任务261 void initMachine()262 {263 for (int p = 1; p <= numMachines; p++)264 changeState(p);265 }266 267 //执行任务,开始仿真268 void simulate()269 {270 while (numJobs > 0) //存在未处理的任务271 {272 int nextToFinish = eList->nextEventMachine();273 timeNow = eList->nextEventTime(nextToFinish);274 // 改变机器 nextToFinish 上的任务275 job* theJob = changeState(nextToFinish);276 // 移动任务到下一台机器,若任务完成,则减少未完成任务数277 if (theJob != NULL && !moveToNextMachine(theJob))278 {279 std::ostringstream info;280 info << "A job over at the " << timeNow << "time";281 debug_info(info.str());282 numJobs--;283 }284 }285 }286 287 //输出任务在每台机器上的等待时间288 void outputTime()289 {290 std::cout << "完成时间 = " << timeNow << std::endl;291 for (int p = 1; p <= numMachines; p++)292 {293 std::cout << "第 " << p << " 号机器完成了 "294 << mArray[p].numTasks << " 道工序," << std::endl;295 std::cout << "等待时间是 " << mArray[p].totalWait << std::endl;296 std::cout << std::endl;297 }298 }299 300 //仿真主程301 void machineSimulate()302 {303 getMachineAndJob();304 initMachine();305 simulate();306 outputTime();307 }

 

转载于:https://www.cnblogs.com/peformer/p/8035000.html

你可能感兴趣的文章
如何解决Android开发学习过程中缺乏后端接口的问题「Android,资源向」
查看>>
关闭wps自动升级
查看>>
【设计模式】面向对象六大原则
查看>>
Web 通信 之 长连接、长轮询(long polling)
查看>>
Git教程摘录
查看>>
JQuery基本知识框架思维导图(上)
查看>>
Java 数据类型
查看>>
iView 发布微信小程序 UI 组件库 iView Weapp
查看>>
运维Caron 的一条心理的os
查看>>
Android - Fragment(二)加载Fragment
查看>>
JVM笔记6-垃圾回收器
查看>>
Java并发编程笔记1-竞争条件&初识原子类&可重入锁
查看>>
工厂+单例模式
查看>>
火爆的在线知识付费,能否缓解你的知识焦虑
查看>>
阿里云ACM英文版上线,论“全局配置”在电商国际化微服务平台建设中的妙用
查看>>
getComputedStyle方法获取元素CSS值
查看>>
关于图片的Base64编码
查看>>
Android加载Gif和ImageView的通用解决方案:android-gif-drawable(1)
查看>>
WPF TextBox/TextBlock 文本超出显示时,文本靠右显示
查看>>
C++的函数对象优于函数指针地方
查看>>