КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Поиск атома
Черновик. pt found:=false; 0 1 while not found do begin if not терм(pt^.left) then pt:=pt^.left else if not терм(pt^.right) then 0 1 pt:=pt^.right else found:=true;
0 1
Начинать каждый раз с корня неэффективно. Нужно искать ближайший к вычисленному атом. Всё прекрасно, если в дереве есть обратная ссылка на родителей. В нашем представлении их нет. Как вернуться к предыдущей вершине? Сохранять ссылки на предыдущую, а затем возвращаться к последней сохранённой.
Begin pt:=root; found:=false; while not found do begin if not терм(pt^.left) then begin push(stack,pt); pt:=pt^.left; end; else if not терм(pt^.right) then begin push(stack,pt); pt:=pt^.right; end else found:=true; pt^.info:=AtomVal(pt); dispose(pt^.left); dispose(pt^.right); end; pop(stack,pt); end; {Каждый раз начинаем с последней сохранённой вершины} До начала цикла (инициализация стека): create(stack); push(stack,root); Условия окончания цикла: not терм(root); not empty(stack); Упражнения: 1) Решить задачу вычисления в случае, когда в дереве хранится ссылка на родителей. 2) То же самое, но вершины содержат только ссылки на родителей. Дерево задаётся списком листьев. Подзадача: вычислить значения атомов.
function AtomVal(pt:pNode):integer; var arg1,arg2:integer; begin arg1:=TermVal(pt^.left); arg2:=TermVal(pt^.right); case pt^.info of ‘+’: AtomVal:=arg1+arg2; ‘*‘: AtomVal:=arg1*arg2; ‘/’: AtomVal:=arg1/arg2; ‘-‘: AtomVal:=arg1-arg2; end; end;
Вернёмся здесь к вопросу об определении типа Info. Сначала он char, затем должен содержать значения типа integer. Типом поля Info по нашему алгоритму должно служить объединение типов. Мы должны не только хранить в этом поле значеня разных типов, но и уметь определять, какого типа значение там хранится в текущий момент. Это помеченное объединение. function TermVal(pt:pNode):integer; begin if {тип Info=integer} then TermVal:=pt^.info else if pt^.info in [‘0’..’9’] then TermVal:=ord(pt^.info)-ord(0) else TermVal:=VarVal[pt^.info]; Очевидный вариант определения типа tInfo – запись. record это integer:boolean; CharInfo:char; IntInfo:integer; end; Этот вариант хорош, если мы не хотим фактически уничтожать дерево. Условие “этоInteger=true” означает, что это выражение уже вычислено. Но если мы хотим уничтожить дерево, то такое определение типа неэффективно. Паскаль предлагает более эффективное решение.
Дата добавления: 2014-01-05; Просмотров: 282; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |