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

5.2. Очереди 213

Размер алгоритма ():

возвратите n

Пустой алгоритм ():

возвратитесь (n = 0)

Фронт алгоритма ():

если пустой () тогда

бросьте исключение QueueEmpty

возвратите Q [f]

Алгоритм dequeue ():

если пустой () тогда

бросьте исключение QueueEmpty f¬ (f + 1) модник Н n = n-1

Алгоритм ставит (e) в очередь:

если размер () = N тогда

бросьте исключение QueueFull Q[r] ¬ e r¬ (r + 1) модник Н.

n = n+1

Кодовый Фрагмент 5.17: Внедрение очереди, использующей круглое множество.

элементы, которые будут в очереди в то же время, тогда основанный на множестве imple-процесс мышления, довольно эффективны. Одно такое возможное применение очереди - динамическое распределение памяти в C ++, который обсужден в Главе 14.

5.2.5 Осуществление очереди с циркулярным связанным списком

В этой секции мы представляем C ++ внедрение очереди ADT использование связанного

представление. Вспомните, что мы удаляем от главы очереди и вставки сзади. Таким образом, в отличие от нашего связанного стека Кодового Фрагмента 5.7, мы не можем использовать наш отдельно связанный класс списка, так как это обеспечивает эффективный доступ только к одной стороне списка. В - земельный участок, наш подход должен использовать циркулярный связанный список, названный CircleList, который был введен ранее в Разделе 3.4.1.

Вспомните, что CircleList поддерживает указатель, названный курсором, который указывает на один узел списка. Также вспомните, что CircleList обеспечивает две членских функции, назад и фронт. Функция назад возвращает ссылку на элемент, на который указывает курсор, и фронт функции возвращает ссылку на элемент, который немедленно следует за ним в круглом списке. Чтобы осуществить очередь, элемент, на который ссылается спина, будет задней частью очереди, и элемент, на который ссылается фронт, будет фронтом. (Почему был бы он не работать, чтобы полностью изменить вопросы, используя заднюю часть круглого списка

214

Глава 5. Стеки, Очереди и Deques как фронт очереди и фронт круглого списка как задняя часть очереди?)

Также вспомните, что CircleList поддерживает следующие функции модификатора. func-tion добавляют, вставляет новый узел сразу после того, как курсор, функция удаляет, немедленно удаляет узел после курсора, и прогресс функции продвигает курсор на следующий узел круглого списка.

Чтобы осуществить операцию очереди, ставят в очередь, мы сначала призываем функцию, добавляют, который вставляет новый элемент сразу после курсора, то есть, сразу после задней части очереди. Мы тогда призываем прогресс, который достижения курсор к этому новому элементу, таким образом делая новый узел задней частью очереди. Процесс иллюстрирован в рисунке 5.5.

(фронт) (задняя часть) курсор

СЛАБЫЙ MSP ATL

(a)

(фронт) (задняя часть) курсор

СЛАБЫЙ MSP ATL BOS

(b)

(фронт) (задняя часть) курсор

СЛАБЫЙ MSP ATL BOS

(c)

Рисунок 5.5: Enqueueing «BOS» в очередь представлял как циркулярный связанный список: (a) перед операцией; (b) после добавления нового узла; (c) после продвижения курсора.

Чтобы осуществить операцию очереди dequeue, мы призываем функцию, удаляют, таким образом удаляя узел сразу после курсора, то есть, фронта очереди. Процесс иллюстрирован в рисунке 5.6.

Структуру класса для получающегося класса, названного LinkedQueue, показывают в Кодовом Фрагменте 5.18. Чтобы избежать синтаксического беспорядка, врожденного от C ++ templated классы, мы приняли решение не осуществить полностью универсальный templated класс. Вместо этого мы решили определить тип для элементов очереди, названных Элементом. В этом экс-вполне достаточный, мы определяем Элемент, чтобы быть последовательности типа. Очередь сохранена в круглом списке