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

5.2. Очереди

(фронт)

СЛАБЫЙ

СЛАБЫЙ

MSP

(фронт)

MSP

(a)

(b)

ATL

ATL

(задняя часть)

BOS

(задняя часть)

BOS

курсор

курсор

215

Рисунок 5.6: Dequeueing элемент (в этом случае «СЛАБЫЙ») от передней репутации очереди - негодовавший как циркулярный связанный список: (a) перед операцией; (b) после удаления узла немедленно после курсора.

структура данных C. Чтобы поддержать функцию размера (который CircleList не обеспечивает), мы также поддерживаем размер очереди в участнике n.

typedef натягивают Элемент; //тип элемента очереди

класс LinkedQueue //очередь как вдвойне связанный список

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

LinkedQueue (); //размер интервала конструктора () константа; //число пунктов в очереди bool пустой () константа; //действительно ли очередь пуста?

константа Elem& фронт () бросок константы (QueueEmpty);//передний элемент

пустота ставит в очередь (константа Elem& e); пустота dequeue () бросок (QueueEmpty);

частный:

CircleList C; интервал n;

;

//поставьте элемент в очередь с задней стороны//dequeue элемент на фронте//членские данные//круглый список элементов//ряд элементов

Кодовый Фрагмент 5.18: класс LinkedQueue, внедрение очереди, основанной на циркулярном связанном списке.

В Кодовом Фрагменте 5.19, мы представляем внедрения конструктора и основных функций accessor, размера, пустого, и фронт. Наш конструктор создает начальную очередь и инициализирует n к нолю. Мы не обеспечиваем явную печь для сжигания отходов производства, полагаясь вместо этого на печь для сжигания отходов производства, обеспеченную CircleList. Заметьте, что func-tion фронт бросает исключение, если попытка предпринята, чтобы получить доступ к первому элементу пустой очереди. Иначе, это возвращает элемент, на который ссылается фронт круглого списка, который, в соответствии с нашим соглашением, является также передним элементом очереди.

216

LinkedQueue:: LinkedQueue ()

: C (), n (0)международный LinkedQueue:: размер () константа

возвращают n;bool LinkedQueue:: пустой () константа

возвращают n == 0;

Глава 5. Стеки, очереди и Deques

//конструктор

//число пунктов в очереди

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

//получите передний элемент

константа Elem& LinkedQueue:: фронт () бросок константы (QueueEmpty)

если (пустой ())

бросьте QueueEmpty («фронт пустой очереди»);

возвратите C.front (); //фронт списка - фронт очереди

Кодовый Фрагмент 5.19: Конструктор и accessor функционируют для класса LinkedQueue.

Определение операций очереди, поставьте в очередь, и dequeue представлены в Кодовом Фрагменте 5.20. Вспомните, что постановка в очередь включает призыв добавить функции, чтобы немедленно вставить новый пункт после курсора и затем продвижения курсора. Прежде dequeuing, мы проверяем, пуста ли очередь, и, если так, мы бросаем исключение. Иначе, dequeuing включает удаление элемента, который немедленно следует за курсором. В любом случае мы обновляем ряд элементов в очереди.

//поставьте элемент в очередь с задней стороны

недействительный LinkedQueue:: поставьте в очередь (константа Elem& e)

C.add (e); C.advance (); n + +;

//вставка после курсора//.. прогресс .and

//элемент dequeue на фронте

недействительный LinkedQueue:: dequeue () бросок (QueueEmpty)

если (пустой ())

бросьте QueueEmpty («dequeue пустой очереди»);

C.remove (); //удаляют из фронта списка

n-;

Кодовый Фрагмент 5.20: ставить в очередь и dequeue функционируют для LinkedQueue.

Заметьте, что, все операции очереди ADT осуществлены в O (1)

время. Поэтому это внедрение довольно эффективно. В отличие от основанного на множестве im-plementation, расширяясь и сокращаясь динамично, это внедрение использует пространство, пропорциональное ряду элементов, которые присутствуют в очереди в любое время.