文档介绍:火车调度——队列与非队列By 秦政题目要求?一列货运列车共有n节车厢,每节车厢将停放在不同的车站。?假定n个车站的编号分别为1~n,货运列车按照第n站至第1站的顺序经过这些车站。车厢编号与它们的目的地一样。?为了便于从列车上卸掉相应的车厢,必须重排车厢顺序,使得各车厢从前往后按编号1到n的次序排列。思考?从前至后依次检查入轨上的所有车厢?如果正在检查的车厢就是下一个满足排列要求的车厢,可以直接把它放如果不是,则把它移动到缓冲铁轨上,直到按输出次序要求轮到它时才将它放到出轨上。If(require==queue)主车道H1H2H3561432N=6,K=3 入轨OUT=1 ?OUT=2 ?If(require==queue)主车道H1H2H3561432OUT=2 ?OUT=3 ?OUT=4 ?OUT=5 ?OUT=6 ?N=6,K=3 出轨最优车道的选择方面:?当在检索缓冲车道的时候,始终按H1,H2,H3的顺序?只有在检索的当前车道,末尾车厢号大于当前要处理的车厢号时,才会查看下一个缓冲车道?这样的做法导致H1末尾车厢号>H2末尾车厢号>H3末尾车厢号>……?故最优车道就是顺次满足条件的第一车道If(require==queue)代码:入轨If(require==queue)inttrainsport(int train[], int &n,int &k){//train[]为处理的列车,n为列车的节数,k为缓冲车道的数量int out = 1, t_rear = 0,j;bool en = 1;//out为应出的车厢号,t_rear为缓冲车道的顺次最后一节车厢号(如无车厢则为0)//j为缓冲车道的变化临时参数//en为车厢是否直接出轨或进入缓冲车道(1),如无,则为0SeqQueue*H = new SeqQueue[k];//新建缓冲车道for (inti = 0; i < n;){if (train[i] == out){//判断能否直接出轨out++;i++;}If(require==queue)else{for (j = 0, en = 0; en == 0 && j < k && i<n; ){//在车厢未直接出轨,且缓冲车道没有完全利用,且车厢仍有剩余的情况下进入缓冲车道的选择H[j].getRear(t_rear);if (H[j].IsFull() != true && t_rear < train[i]){//入缓冲车道则入队列H[j].EnQueue(train[i]);i++; en = 1;}j++;if ((en == 0) && (j == k)){//在尝试所有缓冲车道之后,仍未能进,则无法调度cout << "无法进行调度!" << endl;return 0;}}}}Print(H, n, k);return 1;}代码:入轨代码:出轨&&输出If(require==queue)void Print(SeqQueue*H, int &n, int &k){intt_front = 0;//t_front为缓冲车道的顺次第一节车厢号(如无车厢则为0)for (int out = 1; out < n + 1; out++){boolIsOut = 0;//判断当前out对应车厢是否在缓冲车道内for (int j = 0; j < k; j++){H[j].getFront(t_front);if (t_front == out){//出缓冲车道则出队列cout << out << "号车厢出H" << j + 1 << endl;H[j].DeQueue(t_front);IsOut = 1;break;}}if (IsOut == 0){cout << out << "号车厢直接出轨" << endl;}}}代码:生成随机数If(require==queue)void RandTrain(int *a,int n){//生成n随机数的函数,存在*a中int *mark = new int[n];//标记数组srand((unsigned)time(NULL));//根据时间产生一个变量for (int i = 0; i != n;){int r = rand() % n;if (mark[r] != 1){a[r] = i + 1;mark[r] = 1;//把已经存过的数组进行标记i++;}}cout << "随机产生的车厢序号:";for (int i = 0; i < n; i++){cout << a[i] << " ";}cout << endl;}