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

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

5.1.5 Осуществление стека с универсальным связанным списком

В этой секции мы показываем, как осуществить стек ADT использование отдельно связанного списка.

Наш подход должен использовать универсальный отдельно связанный список, названный SLinkedList, который был представлен ранее в Разделе 3.2.4. Определение нашего стека, названного LinkedStack, представлено в Кодовом Фрагменте 5.7.

Чтобы избежать синтаксического беспорядка, врожденного от C ++ templated классы, мы приняли решение не осуществить полностью универсальный templated класс. Вместо этого мы решили определить тип для элементов стека, названных Элементом. В этом примере мы определяем Элемент, чтобы быть последовательности типа. Мы оставляем задачу производства действительно универсального внедрения как осуществление. (См. Упражнение R-5.7.)

typedef натягивают Элемент; //складывают тип элемента

класс LinkedStack //складывают как связанный список

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

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

константа Elem& вершина () бросок константы (StackEmpty);//главный элемент

недействительный толчок (константа Elem& e); недействительная популярность () бросок (StackEmpty);

частный:

SLinkedList <Элемент> S; интервал n;

;

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

Кодовый Фрагмент 5.7: класс LinkedStack, связанное внедрение списка стека.

Основной член данных класса - универсальный связанный список Элемента типа, названного S. Так как класс SLinkedList не обеспечивает членский размер функции, мы храним текущий размер в членской переменной, n.

В Кодовом Фрагменте 5.8, мы представляем внедрения конструктора и размера и пустых функций. Наш конструктор создает начальный стек и начальную букву - izes n к нолю. Мы не обеспечиваем явную печь для сжигания отходов производства, полагаясь вместо этого на печь для сжигания отходов производства SLinkedList, чтобы освободить связанный список S.

LinkedStack:: LinkedStack ()

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

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

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

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

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

//действительно ли стек пуст?

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

5.1. Стеки 203

Определения операций по стеку, вершины, толчка, и популярности, представлены в

Кодовый Фрагмент 5.9. Какая сторона списка, головы или хвоста, должна, мы выбрали для вершины стека? Так как SLinkedList может вставить и удалить элементы в постоянное время только в голове, голова - ясно лучший выбор. Поэтому, членская вершина функции возвращает S.front (). Толчок функций и популярность призывают функции addFront и removeFront, соответственно, и обновляют ряд элементов.

//получите главный элемент

константа Elem& LinkedStack:: вершина () бросок константы (StackEmpty)

если (пустой ()) бросают StackEmpty («Вершина пустого стека»);

возвратите S.front ();

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

+ + n;

S.addFront (e);

//суйте стек

недействительный LinkedStack:: популярность () бросок (StackEmpty)

если (пустой ()) бросают StackEmpty («Популярность от пустого стека»);

-n;

S.removeFront ();

\ Кодовый Фрагмент 5.9: Основные операции для класса LinkedStack.

5.1.6 Изменение вектора Используя стек

Мы можем использовать стек, чтобы полностью изменить элементы в векторе, таким образом производя nonre-

рукописный алгоритм для проблемы аннулирования множества введен в Разделе 3.5.1. Основная идея состоит в том, чтобы выдвинуть все элементы вектора в заказе в стек и затем заполнить вектор назад снова, суя элементы прочь стека. В Кодовом Фрагменте 5.10, мы даем C ++ внедрение этого алгоритма.

шаблон <typename E>

недействительная перемена (vector<E>& V)

ArrayStack <E> S (V.size ());

для (интервал i = 0; я <V.size (); я ++)

S.push (V [я]);

//полностью измените вектор

//выдвиньте элементы на стек

для (интервал i = 0; я <V.size (); я ++)

V [я] = S.top (); S.pop ();

//суйте их в обратном порядке

Кодовый Фрагмент 5.10: универсальная функция, которая использует стек, чтобы полностью изменить вектор.

Например, если входной вектор, чтобы функционировать перемена содержал пять последовательностей

[Джек, Кейт, Херли, Чжин, Майкл], затем во время возвращения из функции, вектор содержал бы [Майкла, Чжин, Херли, Кейт, Джека].