Bootstrap

C# PriorityQueue优先队列

复制代码

namespace PriorityQueueDemo
{
    public class Task
    {
        public string Name { get; set; } 
    }

    public class TaskPriorityComparer : IComparer<(int, int)>
    {
        public int Compare((int, int) x, (int, int) y)
        {
            // 首先比较紧急程度,然后比较重要性
            int compareUrgency = x.Item1.CompareTo(y.Item1);
            if (compareUrgency != 0) return compareUrgency;
            return x.Item2.CompareTo(y.Item2);
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            // 优先队列是一种特殊的队列,其中每个元素都有一个优先级。元素按照优先级的顺序被移除,而不是它们被添加到队列中的顺序。这意味着高优先级的元素将会在低优先级的元素之前被处理
            // 值越小等级越高

            // 简单的优先队列
            var priorityQueue1 = new PriorityQueue<string, int>();

            // 向队列中添加元素和对应的优先级
            priorityQueue1.Enqueue("任务高", 1);
            priorityQueue1.Enqueue("任务低", 3);
            priorityQueue1.Enqueue("任务中", 2);

            // 按优先级顺序移除和返回元素
            while (priorityQueue1.TryDequeue(out var item, out var priority))
            {
                Console.WriteLine($"处理 {item} 优先级 {priority}");
            }

            // 自定义优先级规则
            var priorityQueue2 = new PriorityQueue<Task, (int, int)>(new TaskPriorityComparer());

            // 添加任务
            priorityQueue2.Enqueue(new Task { Name = "任务A" }, (1, 2));
            priorityQueue2.Enqueue(new Task { Name = "任务B" }, (1, 1));
            priorityQueue2.Enqueue(new Task { Name = "任务C" }, (2, 3));

            // 按优先级顺序处理任务
            while (priorityQueue2.TryDequeue(out var task, out var priority))
            {
                var note = $"执行任务 {task.Name} 紧急程度 {priority.Item1} 重要性 {priority.Item2}";

                Console.WriteLine(note);

                Console.WriteLine("是否输入新任务?(Y / N): ");
                var key = Console.ReadKey(); Console.WriteLine("");

                if (key.Key == ConsoleKey.Y)
                {
                    Console.WriteLine("请输入任务信息(任务X,1,1):");
                    var taskInfo = Console.ReadLine(); Console.WriteLine("");

                    if (!string.IsNullOrEmpty(taskInfo))
                    {
                        var infos = taskInfo.Split(',');
                        var taskName = infos[0];
                        var urgency = Convert.ToInt32(infos[1]);// 紧急程度
                        var importance = Convert.ToInt32(infos[2]);// 重要性
                        priorityQueue2.Enqueue(new Task { Name = taskName }, (urgency, importance));
                        Console.WriteLine($"插入任务 {taskName} 紧急程度 {urgency} 重要性 {importance}");
                    } 
                } 
            }
        }
    }
}

复制代码

;