【408考点之数据结构】队列在操作系统中的任务调度和树的层次遍历

队列在操作系统中的任务调度

在操作系统中,任务调度是一个关键功能,队列常用于管理和调度任务,确保任务按照一定顺序执行。常见的调度算法包括先来先服务(FCFS)、短作业优先(SJF)、轮转调度(RR)等。队列在这些调度算法中的应用主要体现在任务的组织和调度上。

任务调度示例题目

题目1:假设有以下任务到达时间和执行时间,使用FCFS调度算法计算各任务的等待时间和周转时间。

  • 任务A:到达时间0,执行时间4
  • 任务B:到达时间1,执行时间3
  • 任务C:到达时间2,执行时间2
  • 任务D:到达时间3,执行时间1

解答

  1. 按照到达时间顺序排队:A -> B -> C -> D
  2. 计算等待时间和周转时间:
    • 任务A:等待时间0,周转时间4
    • 任务B:等待时间3,周转时间6
    • 任务C:等待时间5,周转时间7
    • 任务D:等待时间6,周转时间7

题目2:使用RR调度算法(时间片为2)计算各任务的等待时间和周转时间。

  • 任务A:到达时间0,执行时间4
  • 任务B:到达时间1,执行时间3
  • 任务C:到达时间2,执行时间2
  • 任务D:到达时间3,执行时间1

解答

  1. 按到达时间顺序排队并按照时间片调度:
    • 时间0-2:任务A执行,剩余2
    • 时间2-4:任务B执行,剩余1
    • 时间4-6:任务C执行,完成
    • 时间6-7:任务D执行,完成
    • 时间7-8:任务A执行,完成
    • 时间8-9:任务B执行,完成
  2. 计算等待时间和周转时间:
    • 任务A:等待时间5,周转时间9
    • 任务B:等待时间5,周转时间8
    • 任务C:等待时间2,周转时间4
    • 任务D:等待时间3,周转时间4

树的层次遍历

树的层次遍历(广度优先遍历)是一种按层次顺序遍历树中节点的算法,通常使用队列实现。遍历过程中,从根节点开始,依次访问每层的所有节点。

层次遍历示例题目

题目1:给定一棵二叉树,按层次遍历输出各节点的值。

复制代码
      1
     / \
    2   3
   / \ / \
  4  5 6  7

解答

  1. 初始化队列并将根节点入队。
  2. 重复以下步骤直到队列为空:
    • 从队列中取出一个节点,访问其值并将其子节点入队。
  3. 遍历顺序:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7

代码示例

c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    int val;
    struct TreeNode *left, *right;
} TreeNode;

typedef struct QueueNode {
    TreeNode *treeNode;
    struct QueueNode *next;
} QueueNode;

typedef struct {
    QueueNode *front, *rear;
} Queue;

void initQueue(Queue *q) {
    q->front = q->rear = NULL;
}

int isEmpty(Queue *q) {
    return q->front == NULL;
}

void enqueue(Queue *q, TreeNode *node) {
    QueueNode *newNode = (QueueNode *)malloc(sizeof(QueueNode));
    newNode->treeNode = node;
    newNode->next = NULL;
    if (isEmpty(q)) {
        q->front = q->rear = newNode;
    } else {
        q->rear->next = newNode;
        q->rear = newNode;
    }
}

TreeNode *dequeue(Queue *q) {
    if (isEmpty(q)) return NULL;
    QueueNode *temp = q->front;
    q->front = q->front->next;
    if (q->front == NULL) {
        q->rear = NULL;
    }
    TreeNode *treeNode = temp->treeNode;
    free(temp);
    return treeNode;
}

void levelOrderTraversal(TreeNode *root) {
    if (root == NULL) return;
    Queue q;
    initQueue(&q);
    enqueue(&q, root);
    while (!isEmpty(&q)) {
        TreeNode *current = dequeue(&q);
        printf("%d ", current->val);
        if (current->left != NULL) enqueue(&q, current->left);
        if (current->right != NULL) enqueue(&q, current->right);
    }
}

int main() {
    TreeNode n1 = {1, NULL, NULL};
    TreeNode n2 = {2, NULL, NULL};
    TreeNode n3 = {3, NULL, NULL};
    TreeNode n4 = {4, NULL, NULL};
    TreeNode n5 = {5, NULL, NULL};
    TreeNode n6 = {6, NULL, NULL};
    TreeNode n7 = {7, NULL, NULL};

    n1.left = &n2;
    n1.right = &n3;
    n2.left = &n4;
    n2.right = &n5;
    n3.left = &n6;
    n3.right = &n7;

    levelOrderTraversal(&n1);
    return 0;
}

题目2:给定一棵二叉树,按层次遍历输出每层的节点值。

复制代码
      1
     / \
    2   3
   / \   \
  4   5   6

解答

  1. 初始化队列并将根节点入队。
  2. 重复以下步骤直到队列为空:
    • 获取当前队列的长度(表示当前层的节点数)。
    • 遍历当前层的所有节点,依次出队并访问其值,同时将其子节点入队。
  3. 遍历顺序:
    • 第一层:1
    • 第二层:2 3
    • 第三层:4 5 6
      队列在操作系统中的任务调度和树的层次遍历中都有重要应用。通过示例题目和解答,我们可以更好地理解队列在这些场景中的具体应用和实现方法。希望这些内容对你理解和应用队列有所帮助。
相关推荐
ゞ 正在缓冲99%…2 小时前
leetcode918.环形子数组的最大和
数据结构·算法·leetcode·动态规划
努力写代码的熊大4 小时前
单链表和双向链表
数据结构·链表
Orlando cron5 小时前
数据结构入门:链表
数据结构·算法·链表
许愿与你永世安宁9 小时前
力扣343 整数拆分
数据结构·算法·leetcode
Heartoxx10 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
杰克尼12 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode
学不动CV了21 小时前
数据结构---线性表理解(一)
数据结构
ysa05103021 小时前
数论基础知识和模板
数据结构·c++·笔记·算法
今天背单词了吗9801 天前
算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·数据结构·笔记·算法
气质、小青年!1 天前
【排序算法】
c语言·数据结构