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

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

5.1.4 Простое основанное на множестве внедрение стека

Мы можем осуществить стек, храня его элементы во множестве. Определенно, стек в этом внедрении состоит из S множества N-элемента плюс переменная целого числа t, который дает индекс главного элемента во множестве S. (См. рисунок 5.2.)

S

012 t N-1

Рисунок 5.2: Реализация стека посредством множества S. Главный элемент в стеке сохранен в клетке S [t].

Вспоминая, что множества в C ++ начинаются в индексе 0, мы инициализируем t к-1 и используем это

стоимость для t, чтобы определить, когда стек пуст. Аналогично, мы можем использовать эту переменную

определить ряд элементов в стеке (t + 1). Мы также вводим новый тип исключения, названного StackFull, чтобы сигнализировать о состоянии ошибки, которое возникает, если мы пытаемся вставить новый элемент, и множество S полон. Исключение StackFull определенный для нашего внедрения стека и не определен в стеке ADT. Учитывая это новое исключение, мы можем тогда осуществить стек функции ADT, как описано в Кодовом Фрагменте 5.3. Размер алгоритма ():

возвратите t + 1

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

возвратитесь (t <0)

Вершина алгоритма ():

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

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

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

Толчок алгоритма (e):

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

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

t¬ t +1

S [t]¬ e

Популярность алгоритма ():

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

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

t¬ t-1

Кодовый Фрагмент 5.3: Внедрение стека посредством множества.

Правильность функций в основанном на множестве внедрении следует за im-

опосредствованно из определения самих функций. Таблица 5.1 показывает

5.1. Стеки 199

продолжительность для участника функционирует в реализации стека множеством. Каждый

из функций стека во множестве реализация выполняет постоянное число государства - монетные дворы, включающие арифметические операции, сравнения и назначения. Таким образом, в этом внедрении Стека ADT, каждая функция бежит в постоянное время, то есть, каждый из них бежит в O (1) время.

Операция

си z e

пустой

вершина

продвинуться

популярность

Время

O (1) O (1) O (1) O (1) O (1)

Таблица 5.1: Исполнение основанного на множестве стека. Космическое использование - O (N), где N

размер множества. Обратите внимание на то, что космическое использование независимо от£ номер nN

из элементов, которые находятся фактически в стеке.

C ++ внедрение стека

В этой секции мы представляем бетон C ++ внедрение вышеупомянутого псевдо - кодовая спецификация посредством класса, названного ArrayStack. Наш подход должен сохранить элементы стека во множестве. Чтобы сохранять кодекс простым, мы опустили стандартные вспомогательные утилиты, такие как печь для сжигания отходов производства, оператор назначения и конструктор копии. Мы оставляем их внедрения как осуществление.

Мы начинаем, предоставляя определение класса ArrayStack в Кодовом Фрагменте 5.4.

шаблон <typename E>

класс ArrayStack

enumСПОСОБНОСТЬ ОПРЕДЕЛЕНИЯ = 100; //способность стека по умолчанию

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

ArrayStack (международная кепка = СПОСОБНОСТЬ ОПРЕДЕЛЕНИЯ);//конструктор от способности

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

константа E& вершина () бросок константы (StackEmpty);//получают главный толчок пустоты элемента (константа E& e) бросок (StackFull);//выдвигают элемент на стек

недействительная популярность () бросок (StackEmpty);//.. функции .housekeeping опущены

частный:

E* S; международная способность; интервал t;

;

//суйте стек

//членские данные//множество элементов стека//складывают способность//индекс вершины стека

Кодовый Фрагмент 5.4: ArrayStack класса, который осуществляет интерфейс Stack.

200