![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 22.10.2011
Сообщений: 12
|
![]()
Здравствуйте!
Есть задача: Формулу вида <формула>::=<терминал>|(<формула><з нак><формула>) <знак>::= + | -| * <терминал>::= 0|1|2|3|4|5|6|7|8|9|a|b|...|z можно представить в виде двоичного дерева с элементами типа char. Написать программу, которая, используя рекурсивную подпрограмму, по формуле из входного файла строит дерево-формулу. Формулу из файла я запихнул в строку, далее возникает 2 трудности: 1) Проверка формулы на правильность. Слышал, есть некий метод рекурсивного спуска, но не могу с ним никак разобраться, помогите, пожалуйста. 2) Построение дерева-формулы. Тут мне подсказали использовать стеки, т.е. запихивать в стеки все терминалы, а знаки писать в корень дерева/поддерева. Но здесь также я не могу избавиться от необходимости неизвестно каким образом решать, записывать знак в левое или правое поддерево. Вот что я сделал: (убрал из программы свою громоздкую и не до конца работающую проверку на правильность формулы и запись в строку из файла) type Link = ^Node; Node = record L,R:link; elem:char; end; BTree = Link; var t:text; {файловая переменная, в кусочке проги ниже ее нет} s:string; Tree:BTree; procedure InsertElement (var Tree:Btree; c:char); var x:Btree; begin new(x); if Tree = nil then begin x^.elem := c; x^.L := nil; x^.R := nil end else begin x^.elem :=c; end end; procedure PrintTree(var Tree:BTree); begin if Tree <> nil then begin PrintTree(Tree^.L); write(' ',Tree^.elem); PrintTree(Tree^.R); end; end; procedure DisposeTree(var Tree:BTree); var x,y:BTree; begin if Tree^.R <> nil then DisposeTree( Tree^.R ); if Tree^.L <> nil then DisposeTree( Tree^.L ); dispose( Tree ); end; procedure Zadacha (var Tree:Btree; s:string); var s1, s2:string; c,sign:char; num, num1, num2, add, multiply, i:integer; begin if length(s) = 1 then begin c := s[1]; InsertElement (Tree, c) end else begin if ((s[1] = '(') and (s[2] = '(')) or ((s[length(s)-1] = ')') and (s[length(s)] = ')')) then begin delete(s,1,1); delete(s,length(s)-1,1) end; add := 0; multiply := 0; for i:=2 to length(s)-1 do begin if (s[i] in ['+','-','*']) and ((s[i+1] in ['(',')']) or(s[i-1] in ['(',')'])) then begin if (s[i] = '+') or (s[i] = '-') then begin add := add + 1; num1 := i end; if (s[i] = '*') then begin multiply := multiply + 1; num2 := i end end end; if (add = 0) then num := num2 else num := num1; sign := s[num]; InsertTree (Tree, sign); for i:=1 to num-1 do s1 := s1 + s[i]; for i:=num+1 to length(s) do s2 := s2 + s[i]; Zadacha (Tree^.R, s2); Zadacha (Tree^.L, s1) end end; |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Построение фрактального дерева | Manya8915 | Общие вопросы по Java, Java SE, Kotlin | 2 | 30.11.2011 23:01 |
Построение остовного дерева методом поиска в глубину | Klik_1602 | Помощь студентам | 0 | 05.06.2011 23:30 |
построение бинарного дерева по инфиксной записи | Екатерина Семенова | Помощь студентам | 1 | 23.05.2011 20:45 |
Построение дерева графа. Язык C | Best1501 | Общие вопросы C/C++ | 2 | 11.12.2010 21:52 |
Построение дерева | TzX | Компоненты Delphi | 2 | 20.07.2010 15:20 |