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

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

В дополнение к членским функциям, требуемым интерфейсом, мы также предоставляем конструктору, которому дают желаемую способность стека как его единственный аргумент. Если никакой аргумент не дан, значение по умолчанию, данное СПОСОБНОСТЬЮ ОПРЕДЕЛЕНИЯ, используется. Это - пример использования аргументов по умолчанию в вызовах функции. Мы используем перечисление, чтобы определить эту полную стоимость по умолчанию. Это - самый простой способ определить символические константы целого числа в пределах C ++ класс. Наш класс - templated с типом элемента, обозначенным E. Хранение стека, обозначенный S, является динамично ассигнованным множеством типа E, то есть, указателя на E.

Затем, мы представляем внедрения функций члена ArrayStack в Кодовом Фрагменте 5.5. Конструктор ассигнует хранение множества, размер которого установлен в способность по умолчанию. Членская способность и t также установлены в их начальные значения. Несмотря на синтаксические сложности определения templated членские функции в C ++, остающиеся членские функции - прямые внедрения своих определений в Коде 5.3. Заметьте, что вершина функций и сует первую проверку, что стек не пуст, и иначе, они бросают исключение. Точно так же толчок сначала проверяет, что стек не полон, и иначе, это бросает исключение.

шаблон <typename E> ArrayStack <E>:: ArrayStack (международная кепка)

: S (новый E [кепка]), способность (кепка), t (-1)//конструктор от способности

шаблон <typename E> международный ArrayStack <E>:: размер () константа

возвращаются (t + 1); //число пунктов в стеке

шаблон <typename E> bool ArrayStack <E>:: пустой () константа

возвращаются (t <0); //действительно ли стек пуст? шаблон <typename E> //возвращают вершину стека

константа E& ArrayStack <E>:: вершина () бросок константы (StackEmpty)

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

возвратите S [t];

шаблон <typename E> //выдвигают элемент на стек

недействительный ArrayStack <E>:: выдвиньте (константа E& e) бросок (StackFull)

если (размер () == способность) бросают StackFull («Толчок к полному стеку»);

S [++ t] = e;

шаблон <typename E> //суют стек

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

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

- t;

Кодовый Фрагмент 5.5: Внедрения членских функций класса ArrayStack

(исключая вспомогательные функции).

5.1. Стеки 201

Продукция в качестве примера

В Кодовом Фрагменте 5.6 ниже, мы представляем пример использования нашего класса ArrayStack. Чтобы продемонстрировать flexibility нашего внедрения, мы показываем два стека различных основных типов. Случай A является стеком целых чисел способности по умолчанию (100). Случай B является стеком строк символов способности 10.

ArrayStack <интервал> A;

//

A

=

[], размер = 0

A.push (7);

//

A

=

[7*], размер = 1

A.push (13);

//

A

=

[7, 13*], размер = 2

суд <<A.top () <<endl; A.pop ();

//

A

=

[7*], продукция: 13

A.push (9);

//

A

=

[7, 9*], размер = 2

суд <<A.top () <<endl;

//

A

=

[7, 9*], продукция: 9

суд <<A.top () <<endl; A.pop ();

//

A

=

[7*], продукция: 9

ArrayStack <последовательность> B (10);

//

B

=

[], размер = 0

B.push («Боб»);

//

B

=

[Боб*], размер = 1

B.push («Элис»);

//

B

=

[Боб, Элис*], размер = 2

суд <<B.top () <<endl; B.pop ();

//

B

=

[Боб*], продукция: Элис

B.push («Канун»);

//

B

=

[Боб, Канун*], размер = 2

Кодовый Фрагмент 5.6: пример использования класса ArrayStack. Содержание стека показывают в комментарии после операции. Вершина стека обозначена звездочкой (» * «).

Обратите внимание на то, что наше внедрение, в то время как простой и эффективный, могло быть увеличено многими способами. Например, это принимает фиксированную верхнюю границу N на ulti-размере помощника стека. В Кодовом Фрагменте 5.4, мы выбрали полную стоимость по умолчанию N = 100 более или менее произвольно (хотя пользователь может установить способность в доводе «против» - structor). Применению, возможно, фактически понадобится намного меньше пространства, чем данный начальный размер, и это было бы расточительно из памяти. Альтернативно, применению, возможно, понадобится больше пространства, чем это, когда наше внедрение стека могло бы «потерпеть крах», если слишком много элементов выдвинуты на стек.

К счастью, есть другие внедрения, которые не налагают произвольное ограничение размера. Один такой метод должен использовать класс стека STL, который был введен ранее в этой главе. Стек STL также основан на векторном классе STL, и это предлагает преимущество, что это автоматически расширено, когда стек overflows его текущее хранение ограничивает. На практике стек STL был бы самым легким и самым практическим способом осуществить основанный на множестве стек. Позже в этой главе, мы видим другие методы, которые используют пространство, пропорциональное натуральной величине стека.

В случаях, где у нас есть хорошая оценка на числе пунктов, бывших должных войти в стек, основанное на множестве внедрение трудно разбить с точки зрения скорости и простоты. Стеки служат жизненно важной роли во многом вычислении applica-tions, таким образом, полезно иметь быстрый стек внедрение ADT, такое как простое основанное на множестве внедрение.

202