| imho.ws |
![]() |
|
|
|||||||
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
|
|
# 1 | |
|
Member
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294
![]() ![]() ![]() |
Польская запись и дерево арифметического выражения
Нужно решить вот такую задачку:
Цитата:
http://algolist.manual.ru/syntax/revpn.php Решил строить дерево из польской записи. (Запись получил. Delphi.) Как реализовать? Спасибо.
__________________
Это жжжж неспроста... |
|
|
|
|
|
# 2 |
|
Advanced Member
Регистрация: 21.04.2005
Адрес: град Москва
Сообщения: 431
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
А дерево нужно строить в текстовом режиме или можно графическими библиотеками?
В любом случае,можно написать некоторую рекурсивную процедуру (пример для графичекого отображения), основные шаги которой таковы: x,y - координаты дерева N - номер просматриваемого символа - перменная должна быть глобальной или введена в выражении польской записи спец символом или иметь там фиксированное место, пусть это будет первый символ - вариантов масса на самом деле char * tree(char* str, int x, int у) { 1)Отрисовываем знак текущей операции (N-тый символ в выражении) в точке (x,y) 2) Отрисовываем две ветви, определяем координаты концов ветвей 3) просматриваем (N--) символ: если это "знак операции", то tree(str, текущее X, текущее Y, текущее N) иначе отрисовываем этот символ 4) просматриваем (N--) символ: если это "знак операции", то tree(str, текущее X, текущее Y, текущее N) иначе отрисовываем этот символ } Минусы подхода: невозожно при таком подходе сделать красивое, ровное дерево - при одном дереве оно будет слишком растянуто, в другом случае - одни ветви будут наезжать на другие... Проблема лечится разбиением задачи на два этапа: на первом мы определяем характеристики дерева (например число уровней дерева), возможно, формируем некоторую новую структуру, где записываем все те данные для корректного отображения дерева (структуру формируем таким образом, что просматривая ее последовательно, не производя доп. вычислений, сразу отобразить нужное дерево); на втором этапе - отрисовка дерева с учетом информации, которую мы получили на первом этапе. Последний раз редактировалось Trotil; 23.10.2005 в 15:23. |
|
|
|
|
# 3 |
|
Advanced Member
Регистрация: 21.04.2005
Адрес: град Москва
Сообщения: 431
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Решил подкрепить свою идею надлядным примером работы алгоритма.
Возьмем, например, такое выражение: "CD*E+AB+*FG*-#" (решетка - символ-указатель на просматриваемый элемент) 1) Вход в функцию: рисуем "-" и ветви: Код:
-
/ \
/ \
/ \
/ \
3) Отрисовываем "*" и ветви: Код:
-
/ \
/ \
/ \
/ \
*
/ \
/ \
Код:
-
/ \
/ \
/ \
/ \
*
/ \
/ \
F G
Опять вызывается функция tree со строкой "CD*E+AB+*#FG*-" (при каждой отрисовке символа решетка сдвигается на один символ влево) И так далее. В конце получаем дерево след. вида: Код:
-
/ \
/ \
/ \
/ \
* *
/ \ / \
/ \ / \
/ \ F G
/ \
+ +
/ \ / \
/ \ / \
A B * E
/ \
/ \
С D
Последний раз редактировалось Trotil; 23.10.2005 в 18:02. |
|
|