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

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

5.1.7 Соответствие круглым скобкам и HTML-ТЭГАМ

В этой секции мы исследуем два связанных применения стеков. Первое соответствует

круглые скобки и группирующиеся символы в арифметических выражениях. Арифметика expres-язычки может содержать различные пары группирующихся символов, такой как

Круглые скобки: «(» и»)»

Скобы: «» И «» скобки: «[» и»]» символы функции пола: «» и «» потолок символов функции: «» и «»,

и каждый вводный символ должен соответствовать его соответствующему заключительному символу. Для

пример, левый символ скобки (» [») должен соответствовать соответствующей правильной скобке (»]») как в следующем выражении:

Правильный: () (()) ([()])

Правильный: ((() (()) ([()]))) неправильный:) (()) ([()])неправильный: ([])неправильный: (

Мы оставляем точное определение соответствия группирующихся символов к Упражнению R-5.8.

Алгоритм для соответствия круглых скобок

Важная проблема в обработке арифметических выражений состоит в том, чтобы удостовериться, что их символы группировки совпадают правильно. Мы можем использовать стек S, чтобы выступить, соответствие группирующихся символов в арифметическом выражении с синглом слева направо просматривают. Тесты алгоритма, которые левые и правые символы подходят и также что левые и правые символы имеют оба тот же самый тип.

Предположим, что нам дают последовательность X = x0x1x2... xn-1, где каждый xi - символ, который может быть группирующимся символом, именем переменной, арифметическим оператором или числом. Основная идея позади проверки, что группирующиеся символы в матче S правильно, состоит в том, чтобы обработать символы в X в заказе. Каждый раз, когда мы сталкиваемся с вводным символом, мы выдвигаем тот символ на S, и каждый раз, когда мы сталкиваемся с заключительным символом, мы трещим, главный символ от стека S (принимающий S не пусто), и мы проверяем, что эти два символа имеют соответствующие типы. (Например, если символ» (» был выдвинут, символ»)» должен быть своим матчем.), Если стек пуст после того, как мы обработали целую последовательность, тогда символы в X матчах.

Предполагая, что толчок и популярные операции осуществлены, чтобы бежать в постоянное время, этот алгоритм пробеги в O (n) полное время. Мы даем псевдокодовое описание этого алгоритма в Кодовом Фрагменте 5.11.

5.1. Стеки 205

Алгоритм ParenMatch (X, n):

Вход: множество X из n символов, каждый из которых является любой группирующимся символом, a

переменная, арифметический оператор или Продукция числа: верный, если и только если все группирующиеся символы в X матчах Позволяют S быть пустым стеком

поскольку я¬ 0 к n- 1 делаю

если X [я] - символ группировки открытия тогда

S.push (X [я])

еще, если X [я] - символ группировки закрытия тогда

если S.empty () тогда

возвратитесь ложный Ничто, чтобы соответствовать

если S.top () не соответствует типу X [я] тогда

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

S.pop (), если S.empty () тогда

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

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

неправильно печатают

каждый символ, подобранный

некоторые символы никогда не подбирались

Кодовый Фрагмент 5.11: Алгоритм для соответствия группирующимся символам в арифметическом выражении.

Соответствие признакам в документе HTML

Другое применение, в котором соответствие важно, находится в проверке HTML

документы. HTML - стандартный формат для содержавших гиперссылку документов о В - ternet. В документе HTML части текста разграничены HTML-тэгами. У простого вводного HTML-тэга есть форма» <имя>», и у соответствующего заключительного признака есть форма» </имя>». Обычно используемые HTML-тэги включают:

• тело: тело документа

• h1: заголовок секции • центр: центр оправдывает • p: параграф • ol: пронумерованный (заказанный) список • литий: пункт списка

Мы показываем типовой документ HTML и возможное предоставление в рисунке 5.3. Наш

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

Очень аналогичный подход к тому данному в Кодовом Фрагменте 5.11 может использоваться, чтобы соответствовать признакам в документе HTML. Мы продвигаемся, каждое открытие наклеивают стек, и когда мы сталкиваемся с заключительным признаком, мы суем стек и проверяем, что два признака соответствуют.

206

<тело> <центр> <h1> Небольшая Лодка </h1> </центр> <p> шторм бросило небольшую лодку как дешевый катер в старой стиральной машине. Три пьяных рыбака привыкли к такому лечению, конечно, но не продавцу дерева, кто, как раз когда безбилетник теперь чувствовал что он

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]