我有这个算术表达式:E=((c+(a*b))-(c+(d*e)))
。
我需要找到第一个运算符放入具有递归函数的二叉树
typedef struct node { char info; struct node*left, *right; } TNode, *Tree;
Tree fBuild ( char *E) // recursive function
Tree aux = (Tree)malloc (sizeof(TNode)); //tree in recursive function
首先,我需要找到第一个运算符,对于此示例是'-'
,以创建第一个节点,然后使用aux->left
和E1=(c+(a*b))
为aux->right
创建递归函数与E2=(c+(d*e))
实施例
-
/ \
/ \
+ +
/ \ / \
c * c *
/ \ / \
a b d e
如何计算括号或其他算法以在c代码中找到第一个运算符?
答案 0 :(得分:0)
常见的解决方案是使用解析技术(如递归下降解析器)构建树。
您可以在语法中隐含操作顺序。
Expression :== Term | Expression ( '+' | '-' ) Term
Term :== Factor | Term ( '*' | '/' ) Factor
Factor :== value | '(' Expression ')'
您必须稍微重新排列语法以避免左递归。一旦你这样做,你可以通过为每个语法规则(例如,ParseExpression,ParseTerm和ParseFactor)编写一个函数来编写递归下降语法,该函数获取输入中的当前位置并返回一个新的树节点。
通过使用输入的开头调用ParseExpression启动解析器,然后您将返回树的根节点。
答案 1 :(得分:0)
假设这是一项编程练习,因此lec
,yacc
和标准算法(如Shunting yard algorithm)的标准工具包不可用。
问题是如何找到顶部减号。要做那个计数括号。为每个开括号添加一个,为每个右括号减去一个。在此示例中,-
是唯一一个计数为1的运算符。在C中假设您有一个字符串s。在C中,这将是一个简单的循环字符串循环。
这不是构建树的最有效方法。您可以一次扫描输入的一个字符,构建部分树,并跟踪深度。