Advertisement
Reemind

Untitled

Apr 23rd, 2021
792
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.78 KB | None | 0 0
  1.     class Program
  2.     {
  3.         static void Main()
  4.         {
  5.             var queue = new PriorityQueue<int,string>();
  6.  
  7.             queue.Enqueue(3, "Сделать домашку по матану");
  8.             queue.Enqueue(1, "Вымыть руки");
  9.             queue.Enqueue(2, "Покушать");
  10.  
  11.             while(queue.HasItems)
  12.                 queue.Dequeue();
  13.         }
  14.     }
  15.  
  16.     class PriorityQueue<TPriority, TItem>
  17.     {
  18.         //Коллекция ключ-значения, отсортированная по ключу
  19.         private readonly SortedDictionary<TPriority, Queue<TItem>> _subQueues;
  20.  
  21.         public PriorityQueue(IComparer<TPriority> priorityComparer)
  22.         {
  23.             _subQueues = new SortedDictionary<TPriority, Queue<TItem>>(priorityComparer);
  24.         }
  25.  
  26.         public PriorityQueue() : this(Comparer<TPriority>.Default) { }
  27.  
  28.         public bool HasItems { get { return _subQueues.Any(); } }
  29.  
  30.         public int Count { get { return _subQueues.Sum(q => q.Value.Count); } }
  31.  
  32.         //вспомогательный метод. добавляем новое значение с приоритетом
  33.         private void AddQueueOfPriority(TPriority priority)
  34.         {
  35.             _subQueues.Add(priority, new Queue<TItem>());
  36.         }
  37.  
  38.         //добавление нового ключ-значения
  39.         public void Enqueue(TPriority priority, TItem item)
  40.         {
  41.             // если приоритет существует, тогда добавляем новое значение, если приоритета не существует,
  42.             //тогда создаем его и добавляем по этому приоритету новое значение
  43.             if (!_subQueues.ContainsKey(priority))
  44.                 AddQueueOfPriority(priority);
  45.  
  46.             _subQueues[priority].Enqueue(item);
  47.         }
  48.  
  49.  
  50.         //Удаляем первый элемент очереди и выводим его на экран.
  51.         public void Dequeue()
  52.         {
  53.             KeyValuePair<TPriority, Queue<TItem>> first = _subQueues.First();
  54.  
  55.             //удаляем и помещаем в переменную первый элемент очереди
  56.             TItem nextItem = first.Value.Dequeue();
  57.  
  58.             //получаем приоритет первого элемента
  59.             TPriority priority = first.Key;
  60.  
  61.             //если у первого элемента больше нет значений, тогда удаляем его приоритет
  62.             if (!first.Value.Any())
  63.             {
  64.                 _subQueues.Remove(first.Key);
  65.             }
  66.             Console.WriteLine("{0} - {1}", priority, nextItem);
  67.         }
  68.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement