m0_64805346 2022-10-12 20:20 采纳率: 81.5%
浏览 86
已结题

队列应用问题,随机排队问题解答

(1)编写代码实现链式队列或循环队列; (2)应用所实现的队列,设计并完成一个随机任务排队问题的求解。要求: ① 任务由任务号、任务产生时间、任务时长、任务开始处理和任务处理完成时间等信息组成; ② 任务由系统随机产生;任务产生后按产生的顺序排队等候处理。可设平均每5分钟(并非每隔5分名 钟)产生一个新任务,任务时长为1~10分钟范围内。 ③ 系统将依次处理排队等候的任务。 ④ 系统运行超过一定时间后将停止产生新任务; ⑤ 按任务处理顺序,输出处理后的任务信息。 (3)针对所选择的求解问题,编写测试程序完成设计任务的求解,并通过运行结果验证算法和程序设计 的正确性。

img

  • 写回答

2条回答 默认 最新

  • 关注

    运行结果:

    img

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    //定义结构体
    typedef struct _datatype
    {
        int id; //任务号
        int time; //任务产生的时间
        int space; //任务持续时间
        int start; //任务开始处理时间
        int end; //任务结束时间
    }Task;
    
    //定义链式结构
    typedef struct _node
    {
        Task task;
        struct _node* next;
    }Node,*Queue;
    
    //初始化队列(带头节点的队列)
    void InitQueue(Queue* head)
    {
        *head = (Queue)malloc(sizeof(Node));
        (*head)->next = NULL;
    }
    
    //判断队列是否为空
    int QueueEmpty(Queue head)
    {
        if (head == NULL)
            return 1;
        if (head->next == NULL)
            return 1;
        return 0;
    }
    
    //入队
    void EnQueue(Queue head, Task task)
    {
        Queue p, t;
        t = (Queue)malloc(sizeof(Node));
        t->task = task;
        t->next = NULL;
        //插入队列
        p = head;
        while (p->next)
            p = p->next;
        p->next = t;
    }
    
    //出队
    void DeQueue(Queue head, Task* task)
    {
        Queue t = 0;
        if (!QueueEmpty(head))
        {
            t = head->next;
            head->next = t->next;
            *task = t->task;
            free(t);
            t = 0;
        }
    }
    
    //显示任务信息
    void ShowTask(Task t)
    {
        printf("id:%d,create_time:%d,start_time:%d,time_space:%d,end_time:%d\n", t.id, t.time,t.start,t.space,t.end);
    }
    
    
    
    
    int main()
    {
        Queue head = 0;
        Task ntask,dtask;
        int totalTime, curTime = 0, taskOrd = 0, remainTime = 0;
        int lastTime = 0;
        int flag;//决定是否生成任务
        
        srand((unsigned int)time(NULL));//生成随机数种子
        dtask.id = taskOrd;
        InitQueue(&head);//初始化队列
    
        scanf("%d", &totalTime);
    
        while (1)
        {
            if (curTime < totalTime)
            {
                flag = rand() % 2;
                if (flag && (curTime - lastTime >= 3))//平均约每5分钟生成1个任务
                {
                    lastTime = curTime;
                    taskOrd++;
                    ntask.id = taskOrd;
                    ntask.time = curTime;
                    ntask.space = rand() % 10 + 1;//生成1-10的随机数
                    
                    EnQueue(head, ntask);
                }
                
            }
            
            if (remainTime == 0 && !QueueEmpty(head))
            {
                if (dtask.id != 0)
                {
                    dtask.end = curTime;
                    ShowTask(dtask);
                }
                dtask.id = 0;
                DeQueue(head, &dtask);
                dtask.start = curTime;
                remainTime = dtask.space;
            }
            else if(remainTime > 0)
            {
                remainTime--;
            }
            curTime++;
    
            //退出循环
            if (curTime > totalTime && remainTime == 0 && QueueEmpty(head))
                break;
            
        }
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 已采纳回答 10月12日
  • 创建了问题 10月12日

悬赏问题

  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目