![]() |
|
Модераторы: volvo877, Snowy, MetalFan |
![]()
|
|
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: нет Всего: 20 |
Всем привет!
Кто может помочь решить задачку, я долго думал - аут полный один человек решил добавить в арифметические выражения кроме круглых, еще и квадратные скобки. причем сначала выполняются действия в квадратных скобках, которые стоят левее и т.д. В таком же порядке высчитываются выражения в круглых скобках. Вот пример: Римскими цифрами показан порядок выполнения действий. Задание таково: 1)выведите на экран "Yes",если скобки в выражении расставлены правильно и "NO" если нет. 2)Если правильно расставлены скобки вывести на экран в порядке их выполнения в отдельном ряду через пропуск для каждой пары скобок позиции их расположения в заданном выражении. Пример: а+(2-с)-[21-8*b +(-2)]+[3] Результат YES 17 20 9 21 23 25 3 7 Как я вижу решение: итак первое - правильно ли расставлены скобки, я предлагаю каждую скобку обозначить цифрой (или буквой и т.д.) например круглые - 1 а квадратные - 2 и получится 1221 2112 и т.д. однако если у нас 1212 то есть ([)] - выдает ошибку. ну или 123 321 - и только так, хотя все равно реализация что-то смутно представляется По поводу второго - позицию строки найти легко: for i:=0 to length(stroki) do if s[i]='[' then $a[i]:=i; в массиве a[i] будут позиции скобок, вот только как их разбить на главные а подчиненные?? |
|||
|
||||
| Denic |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.10.2005 Репутация: нет Всего: нет |
Скобки определяются через константы: вот код:
P.S Хотя незнаю верно или нет код непроверял. Это сообщение отредактировал(а) Denic - 20.11.2005, 09:00 |
|||
|
||||
| volvo877 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 2 Всего: 116 |
Ты вообще подумал, что ты написал? Как последний символ строки может содержать одновременно и '[' и ']'? А по твоему коду только в этом случае строка является правильной... |
||||
|
|||||
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: нет Всего: 20 |
||||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: нет Всего: 173 |
Задача решается элементарно: строим дерево скобочных пар, а затем обходим его. В каждом узле хранятся позиции открывающей и закрывающей скобок и два списка потомков: для круглых и квадратных скобок. При обходе дерева первым выводится второй список. Код я накидал, но он на C++, и переводить его мне было в ломы, уж извините
Это сообщение отредактировал(а) Void - 20.11.2005, 15:59 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: нет Всего: 20 |
Void
Это олимпиадная задачка, в олимпиадах нет ограничений в языках, к сожалению когда мы пришли нам четко сказали - что будем писать или на Паскале или на Бейсике. С++ не пройдет |
|||
|
||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
Вообще, универсальный способ решения любых задач со скобками ─ это использование стека, т.е. при входе открывающейся скобки, она заносится в верх стека (очереди), если входит закрывающаяся, такого же типа, то из стека выкидывается последняя собка...
В конце работы алгоритма, если стек пуст, то решение верно, иначе нет. Используется цикл "Для" до конца строки, с проверкой каждого символа...
А Void, он маньяк по С++... Я три недели назад, после каждого его ответа, почти сразу решал, свои трудности... Конечно, я могу, показать пример, реализации, но я думаю алгоритм с использованием стека и так понятен. Или тот который воид написал... |
|||
|
||||
| Рыжий |
|
|||
![]() Помешанный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1423 Регистрация: 19.9.2004 Репутация: нет Всего: 20 |
Zero
На олимпиаде я решал подобным путем: я напишу не поностью т.к. не помню точно как я писал тогда.
Код не проверял - прямо тут писал. Получается что мы знаем координаты начальной скобки и конечной скобки. после этого можем скопировать этот участок где то в переменную, а после этого вырезать этот участок из исходной строки. Приблизительно так я и решал, но все же выполнить 2 действия довольно сложно, причем судьи тестируют программу в самых сложных условиях |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Модератор: Название темы должно отражать ее суть!
|
|||
|
||||
![]()
|
| Правила форума "Delphi" | |
|
|
Запрещается! 1. Обсуждать и делится взломанными компонентами или программным обеспечением 2. Публиковать ссылки на варез 3. Оффтопить
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |