Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Program
- {
- static void Main()
- {
- var queue = new PriorityQueue<int,string>();
- queue.Enqueue(3, "Сделать домашку по матану");
- queue.Enqueue(1, "Вымыть руки");
- queue.Enqueue(2, "Покушать");
- while(queue.HasItems)
- queue.Dequeue();
- }
- }
- class PriorityQueue<TPriority, TItem>
- {
- //Коллекция ключ-значения, отсортированная по ключу
- private readonly SortedDictionary<TPriority, Queue<TItem>> _subQueues;
- public PriorityQueue(IComparer<TPriority> priorityComparer)
- {
- _subQueues = new SortedDictionary<TPriority, Queue<TItem>>(priorityComparer);
- }
- public PriorityQueue() : this(Comparer<TPriority>.Default) { }
- public bool HasItems { get { return _subQueues.Any(); } }
- public int Count { get { return _subQueues.Sum(q => q.Value.Count); } }
- //вспомогательный метод. добавляем новое значение с приоритетом
- private void AddQueueOfPriority(TPriority priority)
- {
- _subQueues.Add(priority, new Queue<TItem>());
- }
- //добавление нового ключ-значения
- public void Enqueue(TPriority priority, TItem item)
- {
- // если приоритет существует, тогда добавляем новое значение, если приоритета не существует,
- //тогда создаем его и добавляем по этому приоритету новое значение
- if (!_subQueues.ContainsKey(priority))
- AddQueueOfPriority(priority);
- _subQueues[priority].Enqueue(item);
- }
- //Удаляем первый элемент очереди и выводим его на экран.
- public void Dequeue()
- {
- KeyValuePair<TPriority, Queue<TItem>> first = _subQueues.First();
- //удаляем и помещаем в переменную первый элемент очереди
- TItem nextItem = first.Value.Dequeue();
- //получаем приоритет первого элемента
- TPriority priority = first.Key;
- //если у первого элемента больше нет значений, тогда удаляем его приоритет
- if (!first.Value.Any())
- {
- _subQueues.Remove(first.Key);
- }
- Console.WriteLine("{0} - {1}", priority, nextItem);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement