队列工作原理、代码中FIFO图制作及优先级队列实现咨询
队列工作原理解析
基础队列核心逻辑
队列是**先进先出(FIFO)**的数据结构,核心规则是:最早进入队列的元素最先被处理,新元素只能添加到队列尾部,就像日常排队结账的场景。
代码中的队列结构实现
代码通过三个结构体协作完成队列的定义:
// 存储单个任务的描述与优先级 struct job { char description[10]; int priority; }; // 队列节点:用于串联任务,每个节点包含一个任务和指向下一节点的指针 struct node { struct job job; struct node* next; }; // 队列管理器:通过队头(front)和队尾(end)指针,实现快速入队/访问队头 struct queue { struct node* front; struct node* end; };
核心入队操作(enqueue)
入队是向队列添加元素的操作,严格遵循FIFO规则:
void enqueue(struct queue* queue, struct job* job) { struct node* temp = (struct node*)malloc(sizeof(struct node)); temp->job = *job; temp->next = NULL; // 空队列时,新节点同时成为队头和队尾 if (queue->end == NULL) { queue->front = queue->end = temp; return; } // 非空队列时,将新节点追加到队尾,更新队尾指针 queue->end->next = temp; queue->end = temp; }
- 空队列状态:队头和队尾指针都指向
NULL,添加第一个节点时,两个指针同时指向新节点 - 非空队列状态:先让当前队尾节点的
next指向新节点,再把队尾指针移到新节点,保证新元素始终在队尾
FIFO队列的可视化制作方式
要绘制FIFO队列的变化图,只需跟踪front、end指针以及节点间的next链接,用ASCII图就能清晰展示:
以优先级1的队列(任务ABC、DEF、GHI依次入队)为例
- 初始空队列
Q1: front → NULL end → NULL - 添加第一个任务ABC
Q1: front → [ABC, 1] → NULL end → [ABC, 1] - 添加第二个任务DEF
Q1: front → [ABC, 1] → [DEF, 1] → NULL end → [DEF, 1] - 添加第三个任务GHI
Q1: front → [ABC, 1] → [DEF, 1] → [GHI, 1] → NULL end → [GHI, 1]
画图要点
- 用方框代表
struct node,内部标注任务的描述和优先级 - 用箭头表示指针指向(包括
front、end和next指针) - 每完成一次入队操作,更新箭头位置,就能直观体现FIFO的顺序特性
优先级队列的实现逻辑
这段代码采用多队列分组的方式实现优先级队列,核心思路是为每个优先级单独维护一个FIFO队列:
1. 队列初始化
创建与优先级数量(这里是4个,对应优先级1-4)相等的队列,存储在数组queues中。由于数组索引从0开始,优先级1对应queues[0],优先级2对应queues[1],以此类推(代码中用jobs[i].priority - 1来匹配对应队列)。
2. 任务分配
遍历所有任务,根据任务的优先级值,将任务放入对应的队列:
- 优先级1的任务进入
queues[0] - 优先级2的任务进入
queues[1] - 优先级3的任务进入
queues[2] - 优先级4的任务进入
queues[3]
每个队列内部的任务严格遵循FIFO顺序,同优先级的任务按入队先后排列。
3. 优先级调度逻辑
处理任务时,按优先级从高到低(代码中是1到4)的顺序遍历队列:先处理完优先级1队列中的所有任务,再处理优先级2的队列,以此类推,实现高优先级任务优先执行的效果。
内容的提问来源于stack exchange,提问作者Dxrk1285
相关产品推荐
相关产品推荐

