Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

8.2. Осуществление приоритетной очереди со списком 333

8.2.1 C ++ Приоритетное Внедрение Очереди, используя Список

В Кодовых Фрагментах 8.7 до 8,10, мы представляем приоритетное внедрение очереди

это хранит элементы в сортированном списке. Список осуществлен, используя объект списка STL (см. Раздел 6.3.2), но любое внедрение списка ADT было бы достаточно.

В Кодовом Фрагменте 8.7, мы представляем определение класса для нашей приоритетной очереди. Общественная часть класса - по существу то же самое как интерфейс, который был пред - sented ранее в Кодовом Фрагменте 8.4. Чтобы сохранять кодекс столь же простым как possi-ble, мы опустили проверку на ошибки. Участники данных класса состоят из списка, который держит приоритетное содержание очереди и случай объекта компаратора, который мы называем островами.

шаблон <typename E, typename C>

класс ListPriorityQueue

общественность:

международный размер () константа;

//

ряд элементов

пустой bool () константа;

//

действительно ли очередь пуста?

недействительная вставка (константа E& e);

//

элемент вставки

константа E& минута () константа;

//

ми ni мама el ement

пустота removeMin ();

//

удалите минимум

частный:

станд.:: список <E> L; //приоритетное содержание C isLess очереди; //меньше компаратор

;

Кодовый Фрагмент 8.7: определение класса для приоритетной очереди, основанной на списке STL.

Мы не потрудились давать явному конструктору для нашего класса, полагающегося в - земельный участок на конструкторе по умолчанию. Конструктор по умолчанию для списка STL производит пустой список, который является точно, что мы хотим.

Затем, в Кодовом Фрагменте 8.8, мы представляем внедрения простого членского размера функций и пустой. Вспомните, что, имея дело с templated классами, необходимо повторить полные технические требования шаблона, определяя участника func-tions вне класса. Каждая из этих функций просто призывает соответствующую функцию для списка STL.

шаблон <typename E, typename C> //ряд элементов

международный ListPriorityQueue <E, C>:: размер () константа

возвращают L.size ();шаблон <typename E, typename C> //действительно ли очередь пуста?

bool ListPriorityQueue <E, C>:: пустой () константа

возвращают L.empty ();

Кодовый Фрагмент 8.8: Внедрения размера функций и пустой.

334

Глава 8. Кучи и приоритетные очереди

Давайте теперь рассмотрим, как вставить элемент e в нашу приоритетную очередь. Мы определяем p, чтобы быть iterator для списка. Наш подход должен идти через список, пока мы сначала не находим элемент, значение ключа которого больше, чем e's, и затем мы вставляем e только до p. Вспомните, что *p получает доступ к элементу, на который ссылается p, и ++ p достижения p к следующему элементу списка. Мы останавливаем поиск или когда мы достигаем конца списка или когда мы сначала сталкиваемся с большим элементом, то есть, острова удовлетворения (e, *p). При достижении такого входа мы вставляем e только до него, призывая вставку функции списка STL. Кодекс показывают в Кодовом Фрагменте 8.9.

шаблон <typename E, typename C> //вставляют элемент

недействительный ListPriorityQueue <E, C>:: вставка (константа E& e)

станд. typename:: список <E>:: iterator p;

p = L.begin (); в то время как (p! = L.end () &&! острова (e, *p)) ++ p; L.insert (p, e);

//найдите, что больший элемент//вставляет e прежде p

Кодовый Фрагмент 8.9: Внедрение приоритетной очереди функционирует вставка.

Рассмотрите, как вышеупомянутая функция ведет себя, когда у e есть значение ключа, больше, чем кто-либо в очереди. В таком случае, в то время как петля выходит при условии, что p равен L.end (). Вспомните, что L.end () относится к воображаемому элементу, который находится только вне конца списка. Таким образом, вставляя перед этим элементом, мы эффективно прилагаем e к задней части списка, как желаемый.

Вы могли бы заметить использование ключевого слова «typename» в декларации iterator p. Это происходит из-за тонкой проблемы в C ++ вовлечение зависимых имен, который возникает, обрабатывая крепления имени в пределах объектов templated в C ++. Мы не копаемся в запутанности этой проблемы. На данный момент это достаточно, чтобы помнить только к

Предостережение

включайте ключевое слово typename, используя параметр шаблона (в этом случае E), чтобы определить другой тип.

Наконец, давайте рассмотрим операционную минуту и removeMin. Так как список сортирован в порядке возрастания значениями ключа, чтобы осуществить минуту, мы просто возвращаем ссылку на фронт списка. Чтобы осуществить removeMin, мы удаляем передний элемент списка. Внедрения даны в Кодовом Фрагменте 8.10.

шаблон <typename E, typename C> константа E& ListPriorityQueue <E, C>:: минута () константа

возвращают L.front ();шаблон <typename E, typename C>

недействительный ListPriorityQueue <E, C>:: removeMin ()

фронт L.pop ();

/ / ми ni мама el ement

//минимум на фронте

//удалите минимум

Кодовый Фрагмент 8.10: Внедрения приоритетной минуты функций очереди и removeMin.