zoukankan      html  css  js  c++  java
  • [栈和队列]飞机场调度

    一开始题意理解错误,于是就有了下面的字符串版,输出的时候将1转换为0001,下面附上代码

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <assert.h>
      4 typedef int ElemType;
      5 
      6 typedef enum
      7 {
      8     false , true
      9 }_bool;//注意变量类型与变量名之间的区别
     10 typedef struct Node
     11 {
     12     int number ;                      //飞机编号
     13     int waitTime;                      //等待时间
     14     struct Node *next ;             //链式队列中结点元素的指针
     15 } QNode , *QueuePtr;
     16 typedef struct
     17 {
     18     QueuePtr front;
     19     QueuePtr rear;
     20 }LinkQueue;
     21 typedef struct node
     22 {
     23     char runwayName[2];                  //跑道编号
     24     _bool busyFlag;                      //判忙标志位
     25     int occupyTime;                      //当前被占用剩余时间
     26     int busyTime;                        //被占用时间总和
     27     struct node *next;                   //结点元素指针
     28 }runway;
     29 
     30 _bool InitQueue(LinkQueue *Q);
     31 _bool DeleteQueue(LinkQueue *Q,ElemType *airNumber,int *waitTime);
     32 _bool InsertQueue(LinkQueue *Q,ElemType e);
     33 _bool IsQueueEmpty(LinkQueue Q);
     34 
     35 void GetStringfromInt(int x,char *,int int_length);              // 将整形变量转换为4位字符串,如1--“0001”
     36 void InitRunway(runway *,int );
     37 void traverseQueue_addWaitTime(LinkQueue *Q);
     38 int main()
     39 {
     40     int curTime,takeoffNumber,landNumber,takeoffWaitTime,landWaitTime;
     41     int freeNum,runwayAmount,landOccupyTime,takeoffOccupyTime,curLandNumber,curTakeoffNumber;
     42     char ptmpAirNumber[5];
     43     int tmpAirNumber,tmpWaitTime,busytime = 0;
     44     LinkQueue landQueue,takeoffQueue;           //飞机降落、起飞队列
     45     runway *headRunway,*ptrRunway;                               //跑道头指针
     46     curTime = -1; takeoffNumber = 1; landNumber = 5001;
     47     takeoffWaitTime = landWaitTime = freeNum = 0;
     48 
     49     scanf("%d%d%d",&runwayAmount,&landOccupyTime,&takeoffOccupyTime);
     50 
     51     InitQueue(&landQueue);  InitQueue(&takeoffQueue);
     52     headRunway = (runway *)malloc(sizeof(runway));  //开辟头结点
     53     headRunway->next =NULL;
     54     InitRunway(headRunway,runwayAmount);            //对跑道进行初始化
     55 
     56     while(1){
     57         curTime++;
     58         freeNum = 0;
     59         printf("Current Time: %4d
    ",curTime);
     60         ptrRunway = headRunway;
     61         while(ptrRunway->next){
     62             ptrRunway = ptrRunway->next;
     63             if(ptrRunway->occupyTime)   ptrRunway->occupyTime--;
     64             if(ptrRunway->occupyTime == 0 ){
     65                 freeNum++;
     66                 if(1 == ptrRunway->busyFlag){
     67                     printf("runway %s is free
    ",ptrRunway->runwayName);
     68                     ptrRunway->busyFlag = 0;
     69             }
     70             }
     71         }
     72         //读入该分钟要求降落、起飞飞机数,插入队列
     73         scanf("%d%d",&curLandNumber,&curTakeoffNumber);
     74         getchar();                                          //读入换行符
     75         if(curLandNumber < 0 && curTakeoffNumber < 0){
     76             if(!IsQueueEmpty(landQueue)) traverseQueue_addWaitTime(&landQueue);
     77             if(!IsQueueEmpty(takeoffQueue)) traverseQueue_addWaitTime(&takeoffQueue);
     78             break;//机场关闭
     79         }
     80         while(curLandNumber--){
     81             InsertQueue(&landQueue,landNumber);
     82             landNumber++;
     83         }
     84         while(curTakeoffNumber--){
     85             InsertQueue(&takeoffQueue,takeoffNumber);
     86             takeoffNumber++;
     87         }
     88         while(freeNum--){
     89             if(!IsQueueEmpty(landQueue)){               //若降落队列非空
     90                 DeleteQueue(&landQueue,&tmpAirNumber,&tmpWaitTime);
     91                 landWaitTime += tmpWaitTime ;
     92 
     93                 ptrRunway = headRunway;
     94                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
     95                 printf("airplane %4d is ready to land on runway %s
    ",
     96                        tmpAirNumber,ptrRunway->next->runwayName);
     97                 ptrRunway->next->busyTime += landOccupyTime;
     98                 ptrRunway->next->occupyTime = landOccupyTime;
     99                 ptrRunway->next->busyFlag = 1;
    100             }
    101             else if(!IsQueueEmpty(takeoffQueue)){          //若起飞队列非空
    102                 DeleteQueue(&takeoffQueue,&tmpAirNumber,&tmpWaitTime);
    103                 GetStringfromInt(tmpAirNumber,ptmpAirNumber,4);
    104                 takeoffWaitTime += tmpWaitTime ;
    105 
    106                 ptrRunway = headRunway;
    107                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
    108                 printf("airplane %s is ready to takeoff on runway %s
    ",
    109                        ptmpAirNumber,ptrRunway->next->runwayName);
    110                 ptrRunway->next->busyTime += takeoffOccupyTime;
    111                 ptrRunway->next->occupyTime = takeoffOccupyTime;
    112                 ptrRunway->next->busyFlag = 1;
    113             }
    114             else  break;
    115         }
    116        if(!IsQueueEmpty(landQueue)) traverseQueue_addWaitTime(&landQueue);
    117        if(!IsQueueEmpty(takeoffQueue)) traverseQueue_addWaitTime(&takeoffQueue);
    118     }
    119     while((!IsQueueEmpty(landQueue)) || (!IsQueueEmpty(takeoffQueue)) || (freeNum != runwayAmount-1 ) ){
    120         curTime++;
    121         freeNum = 0;
    122         printf("Current Time: %4d
    ",curTime);
    123         ptrRunway = headRunway;
    124         while(ptrRunway->next){
    125             ptrRunway = ptrRunway->next;
    126             if(ptrRunway->occupyTime)   ptrRunway->occupyTime--;
    127             if(ptrRunway->occupyTime == 0 ){
    128                 freeNum++;
    129                 if(1 == ptrRunway->busyFlag){
    130                     printf("runway %s is free
    ",ptrRunway->runwayName);
    131                     ptrRunway->busyFlag = 0;
    132             }
    133             }
    134         }
    135         while(freeNum--){
    136             if(!IsQueueEmpty(landQueue)){               //若降落队列非空
    137                 DeleteQueue(&landQueue,&tmpAirNumber,&tmpWaitTime);
    138                 landWaitTime += tmpWaitTime ;
    139 
    140                 ptrRunway = headRunway;
    141                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
    142                 printf("airplane %4d is ready to land on runway %s
    ",
    143                        tmpAirNumber,ptrRunway->next->runwayName);
    144                 ptrRunway->next->busyTime += landOccupyTime;
    145                 ptrRunway->next->occupyTime = landOccupyTime;
    146                 ptrRunway->next->busyFlag = 1;
    147             }
    148             else if(!IsQueueEmpty(takeoffQueue)){          //若起飞队列非空
    149                 DeleteQueue(&takeoffQueue,&tmpAirNumber,&tmpWaitTime);
    150                 GetStringfromInt(tmpAirNumber,ptmpAirNumber,4);
    151                 takeoffWaitTime += tmpWaitTime ;
    152 
    153                 ptrRunway = headRunway;
    154                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
    155                 printf("airplane %s is ready to takeoff on runway %s
    ",
    156                        ptmpAirNumber,ptrRunway->next->runwayName);
    157                 ptrRunway->next->busyTime += takeoffOccupyTime;
    158                 ptrRunway->next->occupyTime = takeoffOccupyTime;
    159                 ptrRunway->next->busyFlag = 1;
    160             }
    161             else  break;
    162         }
    163         if(!IsQueueEmpty(landQueue)) traverseQueue_addWaitTime(&landQueue);
    164         if(!IsQueueEmpty(takeoffQueue)) traverseQueue_addWaitTime(&takeoffQueue);
    165     }
    166     printf("simulation finished
    ");
    167     printf("simulation time: %4d
    ",curTime);
    168     printf("average waiting time of landing: %4.1f
    ",(float)landWaitTime/(landNumber  - 5001  ));
    169     printf("average waiting time of takeoff: %4.1f
    ",(float)takeoffWaitTime/(takeoffNumber -1 ));
    170 
    171     ptrRunway = headRunway;
    172     while(ptrRunway->next){
    173         ptrRunway = ptrRunway->next;
    174         printf("runway %s busy time: %4d
    ",ptrRunway->runwayName,ptrRunway->busyTime);
    175         busytime += ptrRunway->busyTime;
    176     }
    177     printf("runway average busy time percentage: %4.1f%c
    ",(float)busytime/runwayAmount*100/curTime,'%');
    178 
    179     return 0;
    180 }
    181 void traverseQueue_addWaitTime(LinkQueue *Q)
    182 {
    183     QueuePtr ptr = Q->front;
    184     while(ptr->next != NULL){
    185         ptr = ptr->next;
    186         ptr->waitTime++;
    187     }
    188 }
    189 void InitRunway(runway *head,int num)
    190 {
    191     runway *ptr = head;
    192     int i;
    193     for(i = 1;i <= num;i++){
    194         ptr->next = (runway *)malloc(sizeof(runway));
    195         if(!ptr->next)  exit(1);
    196         ptr = ptr->next;
    197         ptr->busyFlag = 0;
    198         ptr->busyTime = 0;
    199         ptr->occupyTime = 0;
    200         GetStringfromInt(i,ptr->runwayName,2);
    201         ptr->next = NULL;
    202     }
    203 }
    204 void  GetStringfromInt(int x,char *ptr,int int_length)
    205 {
    206     char mod;   int i = 0;
    207     while(i <= (int_length - 1)){
    208         *(ptr + i) = '0';
    209         i++;
    210     }
    211     *(ptr + i) = '';
    212     i = int_length - 1;
    213     do{
    214         mod = x % 10 + '0';
    215         *(ptr + i) = mod;
    216         x = x / 10;
    217         i--;
    218     }while(x);
    219 }
    220 _bool InitQueue(LinkQueue *Q)
    221 {
    222     Q->front = Q->rear =  (QueuePtr)malloc(sizeof(QNode));
    223     if(!Q->front)   return false;
    224     Q->front->next = NULL;
    225     return true;
    226 }
    227 _bool InsertQueue(LinkQueue *Q,ElemType e)//队尾插入
    228 {
    229     QueuePtr tmp = (QueuePtr)malloc(sizeof(QNode));
    230     if(!tmp) return false;
    231 
    232     tmp->number = e;
    233     tmp->waitTime = 0;
    234     tmp->next = NULL;
    235     Q->rear->next = tmp;
    236     Q->rear = tmp;
    237     return true;
    238 }
    239 _bool DeleteQueue(LinkQueue *Q,ElemType *airNumber,int *waitTime)//队头删除
    240 {
    241     QueuePtr tmp;
    242 
    243     if(Q->front == Q->rear) return false;
    244 
    245     tmp = Q->front->next;
    246     *airNumber = tmp->number;
    247     *waitTime = tmp->waitTime;
    248     Q->front->next = tmp->next;
    249     if(Q->rear == tmp )
    250         Q->rear = Q->front;
    251     free(tmp);
    252     return true;
    253 }
    254 _bool IsQueueEmpty(LinkQueue Q)
    255 {
    256     assert(Q.front != NULL && Q.rear !=NULL);
    257 
    258     if(Q.front == Q.rear) return true;
    259     else return false;
    260 }

    后来发现,将int型变量转为char型后再输出,完全没有必要,比如printf("%04d",1);就可以直接输出0001,下面是修改后的代码

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <assert.h>
      4 typedef int ElemType;
      5 
      6 typedef enum
      7 {
      8     false , true
      9 }_bool;//注意变量类型与变量名之间的区别
     10 typedef struct Node
     11 {
     12     int number ;                      //飞机编号
     13     int waitTime;                      //等待时间
     14     struct Node *next ;             //链式队列中结点元素的指针
     15 } QNode , *QueuePtr;
     16 typedef struct
     17 {
     18     QueuePtr front;
     19     QueuePtr rear;
     20 }LinkQueue;
     21 typedef struct node
     22 {
     23     int runwayName;                  //跑道编号
     24     _bool busyFlag;                      //判忙标志位
     25     int occupyTime;                      //当前被占用剩余时间
     26     int busyTime;                        //被占用时间总和
     27     struct node *next;                   //结点元素指针
     28 }runway;
     29 
     30 _bool InitQueue(LinkQueue *Q);
     31 _bool DeleteQueue(LinkQueue *Q,ElemType *airNumber,int *waitTime);
     32 _bool InsertQueue(LinkQueue *Q,ElemType e);
     33 _bool IsQueueEmpty(LinkQueue Q);
     34 
     35 void InitRunway(runway *,int );
     36 void traverseQueue_addWaitTime(LinkQueue *Q);
     37 int main()
     38 {
     39     int curTime,takeoffNumber,landNumber,takeoffWaitTime,landWaitTime;
     40     int freeNum,runwayAmount,landOccupyTime,takeoffOccupyTime,curLandNumber,curTakeoffNumber;
     41     int tmpAirNumber,tmpWaitTime,busytime = 0;
     42     LinkQueue landQueue,takeoffQueue;           //飞机降落、起飞队列
     43     runway *headRunway,*ptrRunway;                               //跑道头指针
     44     curTime = -1; takeoffNumber = 1; landNumber = 5001;
     45     takeoffWaitTime = landWaitTime = freeNum = 0;
     46 
     47     scanf("%d%d%d",&runwayAmount,&landOccupyTime,&takeoffOccupyTime);
     48 
     49     InitQueue(&landQueue);  InitQueue(&takeoffQueue);
     50     headRunway = (runway *)malloc(sizeof(runway));  //开辟头结点
     51     headRunway->next =NULL;
     52     InitRunway(headRunway,runwayAmount);            //对跑道进行初始化
     53 
     54     while(1){
     55         curTime++;
     56         freeNum = 0;
     57         printf("Current Time: %4d
    ",curTime);
     58         ptrRunway = headRunway;
     59         while(ptrRunway->next){
     60             ptrRunway = ptrRunway->next;
     61             if(ptrRunway->occupyTime)   ptrRunway->occupyTime--;
     62             if(ptrRunway->occupyTime == 0 ){
     63                 freeNum++;
     64                 if(1 == ptrRunway->busyFlag){
     65                     printf("runway %02d is free
    ",ptrRunway->runwayName);
     66                     ptrRunway->busyFlag = 0;
     67             }
     68             }
     69         }
     70         //读入该分钟要求降落、起飞飞机数,插入队列
     71         scanf("%d%d",&curLandNumber,&curTakeoffNumber);
     72         getchar();                                          //读入换行符
     73         if(curLandNumber < 0 && curTakeoffNumber < 0){
     74             if(!IsQueueEmpty(landQueue)) traverseQueue_addWaitTime(&landQueue);
     75             if(!IsQueueEmpty(takeoffQueue)) traverseQueue_addWaitTime(&takeoffQueue);
     76             break;//机场关闭
     77         }
     78         while(curLandNumber--){
     79             InsertQueue(&landQueue,landNumber);
     80             landNumber++;
     81         }
     82         while(curTakeoffNumber--){
     83             InsertQueue(&takeoffQueue,takeoffNumber);
     84             takeoffNumber++;
     85         }
     86         while(freeNum--){
     87             if(!IsQueueEmpty(landQueue)){               //若降落队列非空
     88                 DeleteQueue(&landQueue,&tmpAirNumber,&tmpWaitTime);
     89                 landWaitTime += tmpWaitTime ;
     90 
     91                 ptrRunway = headRunway;
     92                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
     93                 printf("airplane %04d is ready to land on runway %02d
    ",
     94                        tmpAirNumber,ptrRunway->next->runwayName);
     95                 ptrRunway->next->busyTime += landOccupyTime;
     96                 ptrRunway->next->occupyTime = landOccupyTime;
     97                 ptrRunway->next->busyFlag = 1;
     98             }
     99             else if(!IsQueueEmpty(takeoffQueue)){          //若起飞队列非空
    100                 DeleteQueue(&takeoffQueue,&tmpAirNumber,&tmpWaitTime);
    101                 takeoffWaitTime += tmpWaitTime ;
    102 
    103                 ptrRunway = headRunway;
    104                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
    105                 printf("airplane %04d is ready to takeoff on runway %02d
    ",
    106                        tmpAirNumber,ptrRunway->next->runwayName);
    107                 ptrRunway->next->busyTime += takeoffOccupyTime;
    108                 ptrRunway->next->occupyTime = takeoffOccupyTime;
    109                 ptrRunway->next->busyFlag = 1;
    110             }
    111             else  break;
    112         }
    113        if(!IsQueueEmpty(landQueue)) traverseQueue_addWaitTime(&landQueue);
    114        if(!IsQueueEmpty(takeoffQueue)) traverseQueue_addWaitTime(&takeoffQueue);
    115     }
    116     while((!IsQueueEmpty(landQueue)) || (!IsQueueEmpty(takeoffQueue)) || (freeNum != runwayAmount-1 ) ){
    117         curTime++;
    118         freeNum = 0;
    119         printf("Current Time: %4d
    ",curTime);
    120         ptrRunway = headRunway;
    121         while(ptrRunway->next){
    122             ptrRunway = ptrRunway->next;
    123             if(ptrRunway->occupyTime)   ptrRunway->occupyTime--;
    124             if(ptrRunway->occupyTime == 0 ){
    125                 freeNum++;
    126                 if(1 == ptrRunway->busyFlag){
    127                     printf("runway %02d is free
    ",ptrRunway->runwayName);
    128                     ptrRunway->busyFlag = 0;
    129             }
    130             }
    131         }
    132         while(freeNum--){
    133             if(!IsQueueEmpty(landQueue)){               //若降落队列非空
    134                 DeleteQueue(&landQueue,&tmpAirNumber,&tmpWaitTime);
    135                 landWaitTime += tmpWaitTime ;
    136 
    137                 ptrRunway = headRunway;
    138                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
    139                 printf("airplane %04d is ready to land on runway %02d
    ",
    140                        tmpAirNumber,ptrRunway->next->runwayName);
    141                 ptrRunway->next->busyTime += landOccupyTime;
    142                 ptrRunway->next->occupyTime = landOccupyTime;
    143                 ptrRunway->next->busyFlag = 1;
    144             }
    145             else if(!IsQueueEmpty(takeoffQueue)){          //若起飞队列非空
    146                 DeleteQueue(&takeoffQueue,&tmpAirNumber,&tmpWaitTime);
    147                 takeoffWaitTime += tmpWaitTime ;
    148 
    149                 ptrRunway = headRunway;
    150                 while(ptrRunway->next->busyFlag) ptrRunway = ptrRunway->next;
    151                 printf("airplane %04d is ready to takeoff on runway %02d
    ",
    152                        tmpAirNumber,ptrRunway->next->runwayName);
    153                 ptrRunway->next->busyTime += takeoffOccupyTime;
    154                 ptrRunway->next->occupyTime = takeoffOccupyTime;
    155                 ptrRunway->next->busyFlag = 1;
    156             }
    157             else  break;
    158         }
    159         if(!IsQueueEmpty(landQueue)) traverseQueue_addWaitTime(&landQueue);
    160         if(!IsQueueEmpty(takeoffQueue)) traverseQueue_addWaitTime(&takeoffQueue);
    161     }
    162     printf("simulation finished
    ");
    163     printf("simulation time: %4d
    ",curTime);
    164     printf("average waiting time of landing: %4.1f
    ",(float)landWaitTime/(landNumber  - 5001  ));
    165     printf("average waiting time of takeoff: %4.1f
    ",(float)takeoffWaitTime/(takeoffNumber -1 ));
    166 
    167     ptrRunway = headRunway;
    168     while(ptrRunway->next){
    169         ptrRunway = ptrRunway->next;
    170         printf("runway %02d busy time: %4d
    ",ptrRunway->runwayName,ptrRunway->busyTime);
    171         busytime += ptrRunway->busyTime;
    172     }
    173     printf("runway average busy time percentage: %4.1f%c
    ",(float)busytime/runwayAmount*100/curTime,'%');
    174 
    175     return 0;
    176 }
    177 void traverseQueue_addWaitTime(LinkQueue *Q)
    178 {
    179     QueuePtr ptr = Q->front;
    180     while(ptr->next != NULL){
    181         ptr = ptr->next;
    182         ptr->waitTime++;
    183     }
    184 }
    185 void InitRunway(runway *head,int num)
    186 {
    187     runway *ptr = head;
    188     int i;
    189     for(i = 1;i <= num;i++){
    190         ptr->next = (runway *)malloc(sizeof(runway));
    191         if(!ptr->next)  exit(1);
    192         ptr = ptr->next;
    193         ptr->busyFlag = 0;
    194         ptr->busyTime = 0;
    195         ptr->occupyTime = 0;
    196         ptr->runwayName = i;
    197         ptr->next = NULL;
    198     }
    199 }
    200 _bool InitQueue(LinkQueue *Q)
    201 {
    202     Q->front = Q->rear =  (QueuePtr)malloc(sizeof(QNode));
    203     if(!Q->front)   return false;
    204     Q->front->next = NULL;
    205     return true;
    206 }
    207 _bool InsertQueue(LinkQueue *Q,ElemType e)//队尾插入
    208 {
    209     QueuePtr tmp = (QueuePtr)malloc(sizeof(QNode));
    210     if(!tmp) return false;
    211 
    212     tmp->number = e;
    213     tmp->waitTime = 0;
    214     tmp->next = NULL;
    215     Q->rear->next = tmp;
    216     Q->rear = tmp;
    217     return true;
    218 }
    219 _bool DeleteQueue(LinkQueue *Q,ElemType *airNumber,int *waitTime)//队头删除
    220 {
    221     QueuePtr tmp;
    222 
    223     if(Q->front == Q->rear) return false;
    224 
    225     tmp = Q->front->next;
    226     *airNumber = tmp->number;
    227     *waitTime = tmp->waitTime;
    228     Q->front->next = tmp->next;
    229     if(Q->rear == tmp )
    230         Q->rear = Q->front;
    231     free(tmp);
    232     return true;
    233 }
    234 _bool IsQueueEmpty(LinkQueue Q)
    235 {
    236     assert(Q.front != NULL && Q.rear !=NULL);
    237 
    238     if(Q.front == Q.rear) return true;
    239     else return false;
    240 }

    提交的时候觉得代码还可以简化,因为机场关闭之前和之后的处理基本一致,因此机场关闭之前和关闭之后的操作完全可以在一块处理,但是合并之后的判断条件一直没做好,有志于追求完美的还可以在简化一下,和大家分享一下!!

  • 相关阅读:
    C语言memmove()函数:复制内存内容(可以处理重叠的内存块)
    boot简介
    MT6753/MT6755 呼吸灯功能添加
    MT6753 使用nt35596s 由于液晶极化出现的闪屏问题解决思路
    MTK平台释疑android M 配置中断相关问题
    MT6755 平台手机皮套驱动实现
    MTK平台 GPU 相关知识
    MTK平台如何定位显示花屏和界面错乱等绘制异常的问题?
    【Python】注释
    【Linux】.gz文件 压缩与解压缩命令
  • 原文地址:https://www.cnblogs.com/Karma-wjc/p/4023067.html
Copyright © 2011-2022 走看看