пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Динамические структуры данных (ДСД). Дерево. Задача о разборе и вычислении выражения. Построение дерева, учет приоритета операций, вычисление выражения по дереву. Основная программа.

Строение ДСД: набор узлов, объединенных с помощью ссылок. Вид узла: Данные+ссылки на другие узлы. Типы структур: Списки, деревья, графы.

 

Дерево – это структура данных, состоящая из узлов и соединяющих их направленных ребер (дуг), причем в каждый узел (кроме корневого) ведет ровно одна дуга.

Корень – это начальный узел дерева.

Лист – это узел, из которого не выходит ни одной дуги.

 

Задача: в символьной строке записано правильное арифметическое выражение, которое может содержать только однозначные числа и знаки операций +-*\. Вычислить это выражение.

Алгоритм:

1)ввести строку;

2)построить дерево;

3)вычислить выражение по дереву.

Ограничения:

1)ошибки не обрабатываем;

2)многозначные числа не разрешены;

3)дробные числа не разрешены;

4)скобки не разрешены.

Алгоритм построения:

1)если first=last (остался один символ – число), то создать новый узел и записать в него этот элемент; иначе...

2)среди элементов от first до last включительно найти последнюю операцию (элемент с номером k);

3)создать новый узел (корень) и записать в него знак операции;

4)рекурсивно применить этот алгоритм два раза:

•построить левое поддерево, разобрав выражение из элементов массива с номерами от first до k-1;

построить правое поддерево, разобрав выражение из элементов массива с номерами от k+1 до last.

Приоритет операций

function Priority ( c: char ): integer;

begin

 case ( c ) of

            '+', '-': Result := 1;

            '*', '/': Result := 2;

            else      Result := 100;

 end;

end;

Номер последней операции:

function LastOperation ( Expr: string;

                        first, last: integer): integer;

var MinPrt, i, k, prt: integer;

begin

 MinPrt := 100;

 for i:=first to last do begin

            prt := Priority ( Expr[i] );

            if prt <= MinPrt then begin

            MinPrt := prt;

            k := i;

            end;

 end;

 Result := k;

end;

Создание узла для числа:

function NumberNode(c: char): PNode;

begin

 New(Result);

 Result^.data := c;

 Result^.left := nil;

 Result^.right := nil;

end;

Построение дерева:

function MakeTree ( Expr: string;

                   first, last: integer): PNode;

var k: integer;

begin

if first = last then begin

            Result := NumberNode ( Expr[first] );

            Exit;

end;

k := LastOperation ( Expr, first, last );

New(Result);

Result^.data  := Expr[k];

Result^.left  := MakeTree ( Expr, first, k-1 );

Result^.right := MakeTree ( Expr, k+1, last );

end;

Вычисление:

function CalcTree(Tree: PNode): integer;

var num1, num2: integer;

begin

 if Tree^.left = nil then begin

            Result := Ord(Tree^.data) - Ord('0');

            Exit;

 end;

num1 := CalcTree(Tree^.left);

num2 := CalcTree(Tree^.right);

case Tree^.data  of

  '+': Result := num1+num2;

  '-': Result := num1-num2;

  '*': Result := num1*num2;

  '/': Result := num1 div num2;

  else Result := MaxInt;

end;

end;

Сама программа:

program qq;

var Tree: PNode;

            Expr: string;

{ процедуры и функции }

begin

 write('Введите выражение > ');

 readln( Expr );

 Tree := MakeTree( Expr, 1, Length(Expr) );

 writeln(' = ', CalcTree(Tree) );

end.

 

24.           


22.01.2015; 17:48
хиты: 219
рейтинг:0
Точные науки
информатика
Языки программирования
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь