刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

表达式·表达式树·表达式求值
众所周知,任何一个表达式,都可以用一棵表达式树来表示。例如,表达式a+b*c,可以表示为如下的表达式树:

/ \
a *
/ \
b c

现在,给你一个中缀表达式,这个中缀表达式用变量来表示(不含数字),请你将这个中缀表达式用表达式二叉树的形式输出出来。
时间限制:1000
内存限制:65535
输入
输入分为三个部分。 第一部分为一行,即中缀表达式(长度不大于50)。中缀表达式可能含有小写字母代表变量(a-z),也可能含有运算符(+、-、*、/、小括号),不含有数字,也不含有空格。 第二部分为一个整数n(n < 10),表示中缀表达式的变量数。 第三部分有n行,每行格式为C x,C为变量的字符,x为该变量的值。
输出
输出分为三个部分,第一个部分为该表达式的逆波兰式,即该表达式树的后根遍历结果。占一行。 第二部分为表达式树的显示,如样例输出所示。如果该二叉树是一棵满二叉树,则最底部的叶子结点,分别占据横坐标的第1、3、5、7……个位置(最左边的坐标是1),然后它们的父结点的横坐标,在两个子结点的中间。如果不是满二叉树,则没有结点的地方,用空格填充(但请略去所有的行末空格)。每一行父结点与子结点中隔开一行,用斜杠(/)与反斜杠(\)来表示树的关系。/出现的横坐标位置为父结点的横坐标偏左一格,\出现的横坐标位置为父结点的横坐标偏右一格。也就是说,如果树高为m,则输出就有2m-1行。 第三部分为一个整数,表示将值代入变量之后,该中缀表达式的值。需要注意的一点是,除法代表整除运算,即舍弃小数点后的部分。同时,测试数据保证不会出现除以0的现象。
样例输入

a+b*c
3
a 2
b 7
c 5

样例输出

abc*+
   +
  / \
 a   *
    / \
    b c
37

使用微信搜索喵呜刷题,轻松应对考试!

答案:

解析:

【喵呜刷题小喵解析】:本题要求将中缀表达式转化为表达式树,并输出其逆波兰式、树形表示和表达式的值。首先,我们需要将中缀表达式转化为逆波兰式。中缀表达式转化为逆波兰式的基本思路是使用一个栈来保存运算符,遍历中缀表达式的每个字符,如果是变量则直接加入结果列表,如果是运算符则弹出栈顶的运算符直到栈为空或该运算符的优先级高于当前运算符,然后将当前运算符入栈。遍历结束后,将栈中剩余的运算符加入结果列表。然后,我们可以利用逆波兰式构建表达式树。首先,我们需要构建一个与逆波兰式等长的节点列表,然后将逆波兰式中的每个字符依次加入节点列表。如果字符是变量,则直接加入;如果字符是运算符,则将其父节点的两个子节点依次加入。最后,我们可以计算表达式的值。首先,我们需要将每个变量的值保存在一个字典中。然后,我们遍历逆波兰式,如果是变量,则直接取出对应的值;如果是运算符,则取出对应的两个子节点的值进行运算,并将结果保存回字典中。最后,返回字典中变量a的值即为表达式的值。注意,除法代表整除运算,即舍弃小数点后的部分。同时,测试数据保证不会出现除以0的现象。
创作类型:
原创

本文链接:表达式·表达式树·表达式求值 众所周知,任何一个表达式,都可以用一棵表达式树来表示。例如,表达式a+

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share