FCFS算法设计


FCFS先来先服务算法

          • FCFS的基本思想
          • 我的设计思路
          • 图解
          • 我的代码:

FCFS的基本思想 先来先服务就是一个思想,谁先到先执行谁,也就是谁在任务队列等待时间越长越先被执行(相同度量下,就是在考虑谁先出队时就要重新更新一次所有任务的等待时间,统一度量)。
我的设计思路 首先,我知道了FCFS特性,这点和数据结构中经典的队列很有异曲同工之妙。后者就是一种先来先出的数据结构。于是我自然的想到了用队列来实现了,至于模拟嘛,我只需要模拟出那个“先来先服务”的意味就行了,你也可以千姿百态的设计哦!!!
图解 【FCFS算法设计】FCFS算法设计
文章图片

我的代码:
#include "stdio.h" #include "string.h" #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define MaxSize 100 /*存储位置最多为100个*/ #define OK 1 #define True 1 #define False 0 #define OverFlow -1 #define UnderFlow -2typedef struct { int number; //定义为任务代号 int time; //定义为等待时间 int kt; //定义为当前任务所要执行的时间}Data; /*定义元素类型 */typedef struct {Data Element[MaxSize]; //0-99 int head; /*队头*/ int rear; /*队尾*/ }SeqQueue, *Queue_s; //定义以一个seqQueue队列类型,和对应的Queue_s队列指针类型/*构造一个空队列*/ void Init_SeqQueue(SeqQueue *S_pointer){ S_pointer->head=-1; S_pointer->rear=-1; //因为数组从0-开始,所以都为-1谓之为“无”,队列初始为无,然后才有。。。 }//判队列是否为空 int Empty_SeqQueue(SeqQueue *S_pointer){ if (S_pointer ->head==S_pointer->rear) return True; //队列为空的(1) elsereturn False; //队列不为空,那么可以正常,可以满载(-1); }//判队满 int Full_SeqQueue(SeqQueue *S_pointer){ if (S_pointer->rear==(MaxSize-1)) /*因为队列不设计为循环的,所以不论前面多少被执行了, 我们只管我们的尾巴,就是只能往后插入*/ return True; //返回队满标记 elsereturn False; //返回队不满标记}//实现插入数据 void insert_SeqQueue(SeqQueue *S_pointer,Data x){ if(!Full_SeqQueue(S_pointer)){ printf("permission insert--\n"); S_pointer->Element[(S_pointer->rear)+1]=x; //将x传递过来的任务信息复制到队列中的元素上。 S_pointer->rear=S_pointer->rear+1; }else{ printf("Ban on insert(队满了)\n"); }} SeqQueue execute_queue(SeqQueue *S_pointer){ SeqQueue x; time_t t; int e; if(Empty_SeqQueue(S_pointer)){ printf("下溢出"); }else{ t=time(NULL); for(e=S_pointer->head+1; erear+1; e++){ S_pointer->Element[e].time =t-S_pointer->Element[e].time; //为每一个更新等待时间,这样对比才是公平的!!! } x=*S_pointer; /* printf("\n*************这里是函数内输出的测试数据****************\n"); printf("\n-=-=这里是当前任务执行时--的时间:%d",&t); printf("\n这是当前的任务进人“任务队列”的等待时间:%d",x.time); printf("\n*******************************************************\n"); */ } return x; } /*清空一个栈*/ void SetNull_SeqQueue(SeqQueue *S_pointer){ S_pointer=NULL; }void main(){ time_t t; int i; int n; int f; int re=-1; Data mission; SeqQueue Q,o; Init_SeqQueue(&Q); printf("-=-=-=-=-任务进入任务队列的过程=-=-=-=-=-\n"); for(n=1; n<=100; n++){ printf("请你输入任务编号(-1键结束):"); scanf("%d",&mission.number); //访问违规 if (mission.number==-1) n=101; //如输入任务号否则退出 else{ printf("当前任务的入队时间获取成功:"); t=time(NULL); f=t; mission.time=f; printf("%d s\n",f); printf("请你输入任务执行时间:"); scanf("%d", &mission.kt); insert_SeqQueue(&Q,mission); } } printf("\n\n=-=-=-=-下面是我们的任务执行过程=-=-=-=-\n"); o=execute_queue(&Q,o); for(i=o.head; i

    推荐阅读