Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2013, 21:52   #1
SadBrick
 
Регистрация: 14.10.2013
Сообщений: 4
Вопрос Интересная задача

Задачи с применением стека

Проверка расстановки скобок
a) Дана последовательность круглых, фигурных и квадратных скобок.
Необходимо проверить правильность данной последовательности.
Например, {}[(){}] - правильная последовательность, {[}] - неправильная.

б) Убедитесь, что ваша программа также распознает последовательности типа
(((()) и (())))) как неправильные. Усовершенствуйте программу так, чтобы
символы отличные от скобок, не влияли на результат обработки.

АТД - Стек Представление - Массив

SadBrick вне форума Ответить с цитированием
Старый 14.10.2013, 22:11   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Тема тут уже обсуждалась. Надо поискать.
Но если лень искать тут, то могу порекомендовать найти книгу:
А.Шень, Программирование, Теоремы и задачи, Москва, МЦНМО, 2004 - эта версия у меня.
Там на стр.97 изложен алгоритм решения.
Идея:
1. Закодировать скобки по следующему правилу:
Код:
(   1
[   2
{   3
)  -1
]  -2
}  -3
2. В процессе анализа строки укладываем открывающиеся скобки (их код) в стек.
3. При обнаружении закрывающейся скобки лезем в стек. Если стек пуст - ошибка.
4. Считанный из стека код сравниваем с кодом закрывающейся скобки. Если неравно - ошибка.
Сравнение - через сложение или типа:
Код:
 Err := (t <> -a[i]);
5. Ели достигнут конец строки и стек пуст - Ок, иначе - ошибка.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 14.10.2013, 22:12   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ну
1) нисходящий рекурсивный анализ
2) как уже сказали, динамика со стеком..
Poma][a вне форума Ответить с цитированием
Старый 14.10.2013, 22:18   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а что интересного в этой задаче?
заводим стек. перебираем по одному символы в строке, если встретили скобочку - если она открывающая - поместили её в стек, если она закрывающая, вытащили элемент с верхушки стека и проверили, что вытащилась скобка того же типа, что и открывающаяся (круглая, квадратная, фигурная), только ОТКРЫВАЮЩАЯ.
Если тип скобок не совпал - выдаём ОШИБКУ (последовательность неправильная) и прекращаем цикл.
Если успешно дошли до конца набора символов (строки), проверяем, пустой ли стек.
Если пустой - БИНГО! Последовательность правильная, если стек после строки не пустой - ошибка (последовательность неправильная).
Всё.

ups!//
я опоздал со своим ответом. Уже верные ответы даны!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.10.2013, 22:21   #5
SadBrick
 
Регистрация: 14.10.2013
Сообщений: 4
По умолчанию

Книгу нашёл спасибо) постараюсь разобраться

ну все равно спасибо за ответ, мб и твои вклады пригодяться)

_________
Не надо плодить подряд несколько коротких сообщений!
Это нарушение правил...
для того, чтобы через минуту/другую дописать сообщение,
не надо создавать ещё один новый пост.
нажимайте на предыдущем кнопку "Редактировать" ("Правка")
и дописывайте в своё сообщение, что Вы хотели добавить!

Модератор

Последний раз редактировалось Serge_Bliznykov; 14.10.2013 в 22:42.
SadBrick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересная задача makskovalko Помощь студентам 5 22.02.2013 22:11
Интересная задача makskovalko Помощь студентам 5 19.12.2012 10:34
Интересная задача! - DannerDOS.kz Паскаль, Turbo Pascal, PascalABC.NET 2 16.12.2008 14:04
Интересная задача Ser Паскаль, Turbo Pascal, PascalABC.NET 3 27.02.2008 00:19