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