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

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

T h e L ittle B o t

Шторм бросил небольшую лодку как дешевый катер в старой стиральной машине. Три пьяных рыбака привыкли к такому лечению, конечно, но не продавцу дерева, кто как раз когда

переплатил за путешествие. </p> <ol> <литий> продавец умрет? </литий> <литий>, Какой цвет - лодка? </литий> <литий> И что относительно Наоми? </литий> </ol> </тело>

(a)

безбилетник теперь чувствовал, что переплатил за путешествие.

1. Продавец умрет? 2. Какой цвет - лодка? 3. И что относительно Наоми?

(b)

Рисунок 5.3: HTML-тэги: (a) документ HTML; (b) его предоставление.

В Кодовых Фрагментах 5.12 до 5,14, мы представляем C ++ программа для соответствия признакам в документе HTML, прочитанном из стандартного входного потока. Для простоты мы предполагаем, что все признаки синтаксически хорошо сформированы.

Во-первых, процедура getHtmlTags читает вход линию за линией, извлекает все признаки как последовательности и хранит их в векторе, который это возвращает.

вектор <последовательность> getHtmlTags ()

вектор <последовательность> признаки;

//сохраните признаки в векторе//вектор html-тэгов

в то время как (cin)

линия последовательности;

getline (cin, линия); интервал на месте продажи = 0; интервал ts = line.find (» <», на месте продажи);

//читайте до конца файла

//введите сплошную линию текста//текущее положение просмотра//возможное начало признака

в то время как (ts! = последовательность:: npos)

интервал te = line.find (»>», ts+1);

//повторитесь до конца последовательности//просмотр для конца

tags.push назад (line.substr (ts, te-ts+1));//прилагают признак к вектору

на месте продажи = te + 1; //прогресс наше положение

ts = line.find (» <», на месте продажи);

возвратите признаки;

//возвратите вектор признаков

Кодовый Фрагмент 5.12: Получите вектор HTML-тэгов от входа и сохраните их в векторе последовательностей.

5.1. Стеки 207

Учитывая пример, показанный в рисунке 5.3 (a), эта процедура возвратилась бы

следующий вектор:

<b o d y>, <c e n t e r>, <h 1>, </h 1>, </c e n t e r>..., </b o d y>

В Кодовом Фрагменте 5.12, мы используем переменную на месте продажи, которая поддерживает настоящее положение во входной линии. Мы используем встроенную членскую функцию последовательности, находят, чтобы определить местонахождение первого возникновения» <» который следует за настоящим положением. (Вспомните обсуждение операций по последовательности от Раздела 1.5.5.) Это положение начала признака сохранено в переменной ts. Мы тогда находим следующее возникновение»> «и храним это положение конца

в te. Сам признак состоит из подстроки длины te- ts + 1 старт в положении

ts. Это выдвинуто на векторные признаки. Мы тогда обновляем настоящее положение, чтобы быть

te + 1 и повторение, пока мы не находим дальнейших случаев» <«. Это происходит, когда функция находки возвращает специальную последовательность стоимости:: npos.

Затем, процедура isHtmlMatched, показанный в Кодовых Фрагментах 5.12, imple-чеканит процесс соответствия признакам.

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

bool isHtmlMatched (константа vector<string>& признаки)

LinkedStack S; //складывают для открытия признаков

вектор typedef <последовательность>:: константа iterator Проход;//iterator тип

//повторите через вектор

для (Проход p = tags.begin (); p! = tags.end (); ++ p)

если (p-> в (1)! = '/') //открывающий признак?

S.push(*p); //выдвигают его на стеке

еще //еще должен закрывать признак

если (S.empty ()) ложное возвращение; //ничто, чтобы соответствовать - неудача

натяните открытый = S.top () .substr (1); //открывающий признак, исключая' <'

натяните близко = p-> substr (2); //закрывающий признак, исключая' </'

если (open.compare (близко)! = 0) ложное возвращение;//не соответствую

еще S.pop (); //суют подобранный элемент

если (S.empty ()) верное возвращение;

еще возвратитесь ложный;

//все соответствовало - хороший//некоторые непревзойденные - плохо

Кодовый Фрагмент 5.13: Проверьте, являются ли HTML-тэги, сохраненные в векторных признаках,

подобранный.

Мы создаем стек, названный S, в котором мы храним вводные признаки. Мы тогда повторяем через вектор признаков. Если вторая череда признаков характеров не «/«, тогда это - вводный признак, и она выдвинута на стек. Иначе, это - заключительный признак, и мы проверяем, что это соответствует признаку сверху стека. Чтобы сравнить открытие и закрытие признаков, мы используем последовательность substr членская функция, чтобы раздеть первый знак от вводного признака (таким образом удаляющий» <») и первые два знака от заключительного признака (таким образом удаляющий» </«). Мы проверяем, что эти две подстроки равны, используя

208

Глава 5. Стеки, Очереди и Deques встроенная строковая функция выдерживают сравнение. Когда петля заканчивается, мы знаем, что каждый заключительный признак соответствует своему соответствующему вводному признаку. Чтобы закончить работу, мы должны проверить, что не было никаких непревзойденных вводных признаков. Мы проверяем это, проверяя, что стек теперь пуст.

Наконец, главная программа представлена в Кодовом Фрагменте 5.14. Это призывает функцию getHtmlTags, чтобы прочитать признаки, и затем это передает их к isHtmlMatched, чтобы проверить их.

международное основное ()

если (isHtmlMatched (getHtmlTags ()))

//главный тестер HTML

//получите признаки и проверьте их

единое время co <<«T h e i n p u t f i l e i s m t c h e d H T M L d o видит Вас m e n t». <<endl; еще

единое время co <<«T h e i n p u t f i l e i s n o t m t c h e d H T M L d o видит Вас m e n t». <<endl;

Кодовый Фрагмент 5.14: главная программа, чтобы проверить, состоит ли входной файл из

соответствие HTML-тэгам.

5.2

Очереди

Другая фундаментальная структура данных - очередь, которая является близким родственником стека. Очередь - контейнер элементов, которые вставлены и удалены согласно принципу метода «первым пришел - первым вышел» (FIFO). Элементы могут быть вставлены в очередь в любое время, но только элемент, который был в очереди самым длинным, может быть удален в любое время. Мы обычно говорим, что элементы входят в очередь сзади и удалены из фронта. Метафора для этой терминологии - линия людей, ждущих, чтобы войти в поездку парка развлечений. Люди входят в заднюю часть линии и входят в поездку с фронта линии.

5.2.1 Тип данных резюме очереди

Формально, тип данных резюме очереди определяет контейнер, который удерживает элементы

последовательность, где доступ элемента и удаление ограничены первым элементом в последовательности, которую называют фронтом очереди и вставкой элемента, ограничена до конца последовательности, которую называют задней частью очереди. Это ограничение проводит в жизнь правило, что пункты вставлены и удалены в очереди согласно принципу метода «первым пришел - первым вышел» (FIFO).

Абстрактный тип данных (ADT) очереди поддерживает следующие операции:

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

dequeue (): Удалите элемент впереди очереди; ошибка происходит

если очередь пуста.