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

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

5.1.2 Стек STL

Стандартная Библиотека Шаблона обеспечивает внедрение стека. Не-derlying внедрение основано на векторном классе STL, который представлен в Разделах 1.5.5 и 6.1.4. Чтобы объявить объект стека типа, это - neces-Сари, чтобы сначала включать файл определения, который называют «стеком». Как с вектором STL, стек класса - часть станд. namespace, таким образом, любой необходимо использовать «станд.:: сложите» или предоставлять заявление «использования». Класс стека - templated с классом отдельных элементов. Например, кодовый фрагмент ниже объявляет стек целых чисел.

#include <стек>

использование станд.:: стек; //делают стек доступным стеком <интервал> myStack; //стек целых чисел

Мы именуем тип отдельных элементов как основной тип стека. Как с векторами STL, стек STL динамично изменяет размеры себя, поскольку новые элементы спешатся.

Класс стека STL поддерживает тех же самых операторов как наш интерфейс. Ниже, мы перечисляем основные членские функции. Позвольте s, как объявлять, быть вектором STL и позволять e обозначить единственный объект, тип которого совпадает с основным типом стека. (Например, s - вектор целых чисел, и e - целое число.)

размер (): Возвратите ряд элементов в стеке. пустой (): Возвратитесь верный, если стек пустой и ложный иначе. продвиньтесь (e): Выдвиньте e на вершину стека.

популярность (): Суйте элемент наверху стека. вершина (): Возвратите ссылку на элемент наверху стека.

Есть одна значительная разница между внедрением STL и нашими собственными определениями операций по стеку. Во внедрении STL результат применения или операционной вершины или популярности к пустому стеку не определен. В частности никакое исключение не брошено. Даже при том, что никакое исключение не брошено, это может очень вероятно привести к Вашему прерыванию программы. Таким образом это до программиста, чтобы быть уверенным, что никакие такие незаконные доступы не предприняты.

5.1.3 C ++ интерфейс стека

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

определить абстрактный тип данных для стека. Определяя абстрактный тип данных, наше основное беспокойство определяет Интерфейс прикладного программирования (API), или просто взаимодействуйте, который описывает имена общественных участников, которых должен поддержать ADT и как они должны объявляться и использоваться. Интерфейс не полное описание всех общественных участников. Например, это не включает

5.1. Стеки 197

частные участники данных. Скорее это - список участников что любое внедрение

должен обеспечить. C ++ язык программирования не обеспечивает простой метод для определения интерфейсов, и поэтому, интерфейс, определенный здесь, не является чиновником К ++ класс. Это предлагается преимущественно в целях иллюстрации.

Неофициальный интерфейс для стека ADT дан в Кодовом Фрагменте 5.1. Этот интерфейс определяет шаблон класса. Вспомните из Раздела 2.3, что такое определение подразумевает, что основной тип элемента, сохраненного в стеке, будет обеспечен пользователем. В Кодовом Фрагменте 5.1, этот тип элемента обозначен E. Например, E может быть любым фундаментальным типом (таким как интервал, случайная работа, bool, и дважды), любой встроенный или определенный пользователями класс (такой как последовательность), или указатель на любой из них.

шаблон <typename E>

Стек класса

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

//интерфейс для стека

международный размер () константа; пустой bool () константа; константа E& вершина () бросок константы (StackEmpty); недействительный толчок (константа E& e); недействительная популярность () бросок (StackEmpty);

// // // // //

число пунктов в стеке стек пусто? главный элемент продвигается, x на стек удаляют главный элемент

;

Кодовый Фрагмент 5.1: неофициальный интерфейс Stack (не полный C ++ класс).

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

Обратите внимание на то, что популярность не возвращает элемент, который совался. Если пользователь хочет знать эту стоимость, необходимо выполнить главную операцию сначала и спасти стоимость. Членский толчок функции берет постоянную ссылку на объект типа E как его аргумент. Вспомните из Раздела 1.4, что это - самый эффективный способ передать объекты к функции.

Состояние ошибки происходит, звоня или популярности функций или вершины на пустом стеке. Это сообщено, бросив исключение типа StackEmpty, который определен в Кодовом Фрагменте 5.2.

//Исключение, брошенное на выполнение вершины или популярности пустого стека.

класс StackEmpty: общественный RuntimeException

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

StackEmpty (константа string& допускают ошибку): RuntimeException (допускают ошибку)

;

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

пустой стек. Этот класс получен из RuntimeException от Раздела 2.4.

198