任给算术表达式,试编写一个算法,输出该算术表达式的二*树结构。

来源:百度知道 编辑:UC知道 时间:2024/05/21 09:06:53
任给算术表达式,试编写一个算法,输出该算术表达式的二*树结构。

例如:(a-b)*(c+d)

*

-+

abcd
需要用TASM汇编模式来做这道题~~~这是我最头痛的~~~希望高人指点~~~

具体算法要用到递归和二叉树中序遍历,我对这块不熟悉,手头又没有资料。
只能说说算法的大概。
像这种有括号优先的,难度较大。
Dim Ar(N) 'N:二叉树的深度
function(表达式)

整个表达式从左向右读取,
有括号成对的提取出来(左侧表达式),
判断右侧近邻符号是乘除法符号则记录到二叉树
然后分别对乘除法符号进行判断
IF 成立,Then
分段split()
记录符号,再记录左右操作数
elseif 判断加减法符号 Then
Split()
End If

对表达式的右侧,递归调用本函数
直到二叉树顶结束
}

~~~还没有答案阿

好象是编译原理的方式就可以解决了,楼上说得也对。通过编译原理里面对语言的分析就可以做出来,不过这可是个大工程了。

栈运算。维护一个变量栈和一个符号栈(数字认为是变量)

符号 栈内优先级 栈外优先级
+ - 2 1
* / 4 3
^ 6 5
( 0 8
) 8 0

可以看到,优先级高的符号先算。为了方便起见,先在表达式两边加括号。
依次读入每个字符,如果是变量则入变量栈。如果是符号,就与栈顶符号比较优先级。
如果相等,则同时退栈(不处理,读下一字符)。
如果栈外大,则入栈。
如果栈内大,则以栈内符号为根,变量栈最顶2元素成为他的孩子(该2变量退栈),创建一个新的变量代表这颗以该符号为根,两变量为孩子的树。同时栈外的这个符号保留,继续与栈顶比较。

还原成树结构,取出变量栈中的最后一个元素(如果表达式合法,此时符号栈应为空,变量栈仅有1个变量),依次扩展,具体可以使用以下数据结构:

(我是学PASCAL的,不会C,所以用PASCAL语言写出来咯。。。)

type
pnode=^node;
node=record