队列的应用——随机任务排队问题

题目

① 任务由任务号、任务产生时间、任务时长、任务开始处理和任务处理完成时间等信息组成;

② 任务由系统随机产生;任务产生后按产生的顺序排队等候处理。可设*平均*每5分钟(并非每隔5分名钟)产生一个新任务,任务时长为1~10分钟范围内。

③ 系统将依次处理排队等候的任务。

④ 系统运行超过一定时间后将停止产生新任务;

⑤ 按任务处理顺序,输出处理后的任务信息。

解答

实现链式队列 < LinkQueue.h>

#include<malloc.h>
#include<stdio.h>
//元素 
typedef struct {
    int Num;
    double GenTime;//产生时间
    double DurTime;//时长
    double StaTime;//开始时间
    double EndTime;//结束时间
}Task;
typedef Task ElemType; 
//链队结点的类型定义
typedef struct node
{
    ElemType data;      //存放元素 
    struct node* next;   //下一个结点指针 
}DataNode;              
//链队的类型定义
typedef struct
{
    DataNode* front;        //指向队首结点 
    DataNode* rear;         //指向队尾结点 
}LinkQueue;                
//初始化队列
void InitQueue(LinkQueue*& q)
{
    q = (LinkQueue*)malloc(sizeof(DataNode));
//为队列申请了一个结点大小的地址空间 
    q->front = q->rear = NULL;
}
//销毁队列
void DestroyQueue(LinkQueue*& q)
{
    DataNode* pre = q->front, * p;     //pre指向队首结点 
    if (pre != NULL)
    {
        p = pre->next;               //首结点后移 
        while (p != NULL)            //删除结点 
        {
        free(pre);             //原来的首结点删除 
        pre = p; p = pre->next;//pre、p同步后移 
    }
    free(pre);           //释放最后一个数据结点 
    }
    free(q);              //释放链队结点 
}
//判断队列是否为空
bool QueueEmpty(LinkQueue* q)
{
        return(q->rear == NULL);
}
//进队列
void enQueue(LinkQueue*& q, ElemType e)
{
    DataNode* p = NULL;//建好结点 
    p = (DataNode*)malloc(sizeof(DataNode));//为其分配地址空间 
    p->data = e;//存好数据 
    p->next = NULL;
    if (q->rear == NULL)  //若链队为空,置为队首和队尾 
        q->front = q->rear = p;
    else                  //若链队不空 置为队尾 
    {
        q->rear->next = p;    
        q->rear = p;
    }
}
//出队列
bool deQueue(LinkQueue*& q, ElemType e)
{
    DataNode* t;
    if (q->rear == NULL) //原来队列为空 
        return false;
    //有,则先处理(工作对接)  
    t = q->front;        //t指向首结点 
    if (q->front == q->rear)      //原来队列中只有一个数据结点时 
        q->front = q->rear = NULL;
    else       //原来队列中有两个或两个以上结点时 
        q->front = q->front->next;//队首出列 
    //再释放(辞职)   
    e = t->data;
    free(t);
    return true;
}

随机任务排队

#include "LinkQueue.h"
#include <stdlib.h>
#include <iostream>
using namespace std; 
#define random(a,b) a+rand()/double(RAND_MAX/(b-a))
//产生任务
LinkQueue*& GenTask(LinkQueue*& q,double t) 
{
    double k=t;
    
    double i=12,j=1,s=k;
    for (i=0;i<k;i=i+random(4.5,5.5))
    {
        ElemType e;
        e.Num=j++; 
        e.GenTime=i;
        e.StaTime=s;
        e.DurTime=random(1,10);
        cout<<"时刻:"<<e.GenTime<<"分,系统产生任务"<<e.Num<<",该任务时长为"<<e.DurTime<<"分钟\n"; 
        e.EndTime=s+e.DurTime;
        s=s+e.DurTime;
        
        enQueue(q, e);
        
    }
    return q;
}
//处理任务
LinkQueue*& ProTask(LinkQueue*& q) {
    while(!QueueEmpty(q)){
        ElemType e=q->front->data;
        deQueue(q, e);
        cout<<"时刻:"<<e.StaTime<<"分,系统开始处理任务"<<e.Num<<",时刻"<<e.EndTime<<"处理完成\n";
        cout<<"-------------------------------------------------------------\n";
        cout<<"任务号:"<<e.Num<<endl
        <<"产生时间:"<<e.GenTime<<endl
        <<"任务时长:"<<e.DurTime<<endl
        <<"开始处理时间"<<e.StaTime<<endl
        <<"处理完成时间"<<e.EndTime<<endl;
        cout<<"-------------------------------------------------------------\n"; 
    }
​
} 

测试

int main(){
    
    LinkQueue* TaskQueue;
    InitQueue(TaskQueue);
    cout<<"随机任务排队问题\n";
    double t;
    cout<<"请输入系统产生任务的时长:(单位:分钟)\n";
    cin>>t;
    cout<<endl;
    cout<<"/**********系统产生任务**********/" <<endl<<endl;
    GenTask(TaskQueue,t);
    cout<<endl;
    cout<<"/**********系统处理任务**********/" <<endl<<endl;
    ProTask(TaskQueue); 
    cout<<("系统已经处理完所有生成的任务!\n");
    DestroyQueue(TaskQueue);
    return 0;
}

运行截图

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值