| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Польская запись |
| Автор: Zero 23.10.2004, 02:03 | ||
| Народ, у меня такая проблемма: У меня курсач в котором нужно составить прог-у чтобы она переводила инфиксную запись в постфиксную, но в задании есть такие условия: 1) исходное выражение описывается бинарным деревом; 2) для представления дерева использовать списки потомков реализованых в динамической памяти. ............ Впринципе саму прогу то я уже написал, вот только в ней какаято ошибка, причём не понятно почему (по моему представлению всё правильно, но прог-а не работает); Сама ошибка как я понимаю, находится при удалении вершины. Но вот как её исправить, я не знаю??? Если кто сможет помочь мне с этим, буду очень признателен!!! Замечание: На вид здесь код большой но на самом деле основная судь начинается после слов "Начало алгоритма"... Код:
|
| Автор: p0s0l 23.10.2004, 13:47 |
| В чём заключается ошибка ? |
| Автор: Zero 23.10.2004, 14:39 |
| Ну например, если есть дерево, дапустим из трёх вершин, где 1-ая вершин например корень, 2-ая -- левый потомок, а 3-ья правый потомок, то при выполнении программы в моём разделе "(*** Начало алгоритма ***)", сначала выполнится проверка: если левый потомок присутствует то NTR:=номер этого потомка и Repeat, повторится, а так как у 2-ой вершины левого потомка нет, то выполнится третье условие, где эта вершина занесётся в Result, и должна будет удалится, но она при очередном проходе в поисках следующей вершины снова заносится в NTR и TR... И где тут ошибка никак немогу понять... |
| Автор: p0s0l 24.10.2004, 15:05 | ||||||
Вопрос:
Что в итоге должно получиться ? Какая строка ? Потом, сам подумай, в твоём примере про 3 вершины:
1) NTR = корень 2) в Repeat сработало первое условие, теперь: NTR = левый потомок, TR = "1" 3) в Repeat сработало третье условие, теперь: Result := "1 ", NTR = корень, имя вершины №2 = "" (удалена) 4) в Repeat сработало первое условие, теперь: NTR = левый потомок, TR = "1" Т.е. история повторяется... Т.к. в условиях 1 и 2 Repeat'а проверяется Name текущей вершины, а не левого/правого потомка... (или что-то другое, но не то что нужно) У тебя запутанные структуры... Тут сложно сориентироваться... Попробуй такое условие: if (T.LP[NTR].Next <> nil) and not(Prohod) and (T.Pred[T.LP[NTR].element.Num].Name<>'') then ... Аналогично для второго условия... Почему бы не сделать структуру дерева попроще, т.е. более понятную:
Корень дерева - нод, имеет два потомка (LP, RP), те в свою очередь то же имеют и т.д... Так проще было бы, имхо... Или у тебя какие-то дополнительные цели были при введении такой замудрёной системы ? |
| Автор: Zero 24.10.2004, 17:20 | ||||
Извиняюсь, я забыл сказать, что обход дерева производится в порядке "LRT"(т.е. сначало просматривается левая вершина, потом правая и потом корень) Ответ на вопрос: 8_4_10_11_9_5_2_6_7_3_1 Да кстате, спасибо PoSoL, что помог мне разобратся, покрайней мере в том где была ошибка, но у меня почемуто досих пор не работает прога до конца, я конечно исправил некотрую часть кода, но гдето что-то осталось нетак...
Замечание: Посол кстати ты предложил ещё один вариант дерева, но как понему что-либо сделать, ведь там многие вещи (например информация о предках и т.п.) отсутствует, но если ты знаешь как по нему можно-было бы сделать чё-нибудь, то пришли Пример... Заранее спасибо!!! С уважением Zero |
| Автор: p0s0l 24.10.2004, 18:27 | ||||||||
Трудно тут разобраться, так что лучше сразу предложу вот что:
Вот пример:
MakeTree - создаёт дерево из текста FreeTree - освобождает дерево (память, занимаемую деревом) WalkTree - обходит дерево в порядке LRT Пример юзанья: занеси в Memo1 такой текст:
Первая строка - имя вершины-корня Далее идёт описание дерева: <имя вершины>:<левый потомок>,<правый потомок> PS: Имена - не обязательно цифровые Далее на кнопку повесь такое:
В результате будет то, что ты написал в качестве ответа... ИМХО, такая структура более понятна и с неё легче работать, особенно рекурсией... |
| Автор: Zero 24.10.2004, 22:28 |
| Посол, извени что опять задаю тупые вопросы, но у меня функция PosEx, не работает, поэтому пока я разобрал смысл всего кода, то ...помоему там всё логично но хотелось бы всётаки его проверить... Помоему как я понял функция PosEx определяет положение след. <Параметра1>, начиная с <Параметра3>, но за счёт того что ты использовал в процедуре Const s:string, то из этой сторки нельзя ничего удалять и соответственно чтобы нестандартно сделать функцию PosEx надо ещё не мало помучится, если ты знаешь как она сделана, то ни бог бы ты мне добавить этот код... Ещё раз спасибо, за беспокойства!!! Zero. |
| Автор: p0s0l 24.10.2004, 22:34 | ||||
| Забыл, извини! Ты правильно понял смысл PosEx, надо прописать в Uses модуль StrUtils:
А так, в следующий раз, если где-то найдёшь код с функцией, которой у тебя нет, наведи на неё курсор, нажми F1, и если выведется справка по этой функции - то это стандартная дельфовая функция, и там указан, какой Unit надо использовать (прописать в uses)...
|
| Автор: Zero 24.10.2004, 23:13 |
| Вау, Клёво, Спасибо большое Посол!!! , ты даже не представляешь как ты мне помог!!! Я уже несколько дней мучился с этой прого-й, а ты мне её круто упростил!!! |
| Автор: p0s0l 24.10.2004, 23:14 |
| |