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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2011, 16:20   #1
proser93
Пользователь
 
Регистрация: 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;
proser93 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение фрактального дерева 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