# 算数表达式--二叉树

算数表达式--二叉树

【算法分析】表达式不合法有三种情况：①左右括号不匹配；②变量名不合法；③运算符两旁无参与运算的变量或数。

 例如，表达式：a+(b-c)/d 运算顺序：    ③ ① ②

【算法步骤】

program exptree;

uses crt;

type

point=^tree;

tree=record

data:string;

lt:point;

rt:point;

end;

var

n,len,k:integer;

ex:string;

letters:set of char;

root:point;

procedure error(er:byte);    {出错信息提示}

begin

write('Enter error:');

case er of

1:writeln('No letter');

2,3:writeln('No expressint');

4:writeln('No+,*,-or/');

5:writeln('No(or)');

end;

end;

procedure create(left,right:integer;var p:point);

var q:point;

k,n:integer;

begin     {找运算级别最低的运算符}

if ex[left]='(' then

begin

n:=left+1;k:=0;

while (n<right) and (k>=0) do

begin

if ex[n]='(' then inc(k);

if ex[n]=')' then dec(k);

inc(n);

end;

if n=right then

begin

dec(right);inc(left);

end;

end;

if right<left then error(1);

n:=right;k:=0;

repeat

if ex[n]=')' then inc(k);

if ex[n]='(' then dec(k);

dec(n);

until (((ex[n]='+') or (ex[n]='-')) and (k=0)) or (n<left);

if n=left then error(3);

if n>left then

begin

with p^ do

begin

data:=ex[n];

new(q);lt:=q;

new(q);rt:=q;

end;

create(left,n-1,p^.lt);

create(n+1,right,p^.rt);

end

begin

n:=right;

repeat

if ex[n]=')' then inc(k);

if ex[n]='(' then dec(k);

dec(n);

until (((ex[n]='*') or (ex[n]='/')) and (k=0)) or (n<left);

if n=left then error(3);

if n>left then

begin

with p^ do

begin

data:=ex[n];

new(q);rt:=q;

new(q);lt:=q;

end;

create(left,n-1,p^.lt);

create(n+1,right,p^.rt);

end

else    {only string}

begin       {求叶子结点的字串}

for k:=left to right do

if not(ex[k] in letters) then error(1);

p^.data:='';

for k:=left to right do

p^.data:=p^.data+ex[k];

p^.lt:=nil;

p^.rt:=nil;

end;

end;

end;

procedure pr_tree(w,dep:integer;p:point);    {画出生成的表达式树}

var h,i,lt,rt:integer;

begin

h:=40;for i:=1 to dep do h:=h div 2;

gotoxy(w-1,dep*3);write('(',p^.data,')');

if p^.lt=nil then lt:=w

else begin

lt:=w-h;pr_tree(lt,dep+1,p^.lt)

end;

if p^.rt=nil then rt:=w

else begin

rt:=w+h;pr_tree(rt,dep+1,p^.rt);

end;

if lt<>rt then

begin

gotoxy(w,dep*3+1);write('|');

gotoxy(lt,3*dep+2);write('|');

for i:=lt to rt-2 do write('-');write('|');

end;

end;

begin

clrscr;

letters:=['A'..'Z','a'..'z','0'..'9'];

repeat

len:=length(ex)

until len>0;

n:=1;

k:=0;

while (n<=len) and (k>=0) do   {判断左括号是否匹配}

begin

if ex[n]='(' then inc(k);

if ex[n]=')' then dec(k);

inc(n);

end;

if k<>0 then error(5);

new(root);create(1,len,root);

end.

uses  <单元名表>；    {单元名表是指用逗号隔开的1个或多个单元名称}

crt                   {具有屏幕模式控制、扩展键盘码、颜色、窗口、声音等功能}

clrscr                 {清楚当前窗口或屏幕，光标返回到左上角}

什么是Bit-map

所谓的Bit-map就是用一个bit位来标记某个元素对应的Value， 而Key即是该元素。由于采用了Bit为单位来存储数据，因此在存储空间方面，可以大大节省。

posted @ 2012-10-12 09:16  zero516cn  阅读(29900)  评论(0编辑  收藏  举报