FCFS算法设计

FCFS先来先服务算法

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

FCFS的基本思想

先来先服务就是一个思想,谁先到先执行谁,也就是谁在任务队列等待时间越长越先被执行(相同度量下,就是在考虑谁先出队时就要重新更新一次所有任务的等待时间,统一度量)。

我的设计思路

首先,我知道了FCFS特性,这点和数据结构中经典的队列很有异曲同工之妙。后者就是一种先来先出的数据结构。于是我自然的想到了用队列来实现了,至于模拟嘛,我只需要模拟出那个“先来先服务”的意味就行了,你也可以千姿百态的设计哦!!!

图解

FCFS算法设计_第1张图片

我的代码:
#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 -2

typedef 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)
              else  return False;//队列不为空,那么可以正常,可以满载(-1);
}

//判队满
int Full_SeqQueue(SeqQueue *S_pointer){
    if (S_pointer->rear==(MaxSize-1))
   /*因为队列不设计为循环的,所以不论前面多少被执行了,
   我们只管我们的尾巴,就是只能往后插入*/
       return True;
               //返回队满标记
       else  return 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

你可能感兴趣的:(玩算法)