如何在算术表达式中找到第一个运算符?

时间:2014-05-16 15:19:48

标签: c math expression binary-tree

我有这个算术表达式: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->leftE1=(c+(a*b))aux->right创建递归函数与E2=(c+(d*e))

实施例

          -

      /       \
     /         \
    +           +
  /   \        /  \
 c     *      c    *
      /  \        /  \
     a    b      d     e

如何计算括号或其他算法以在c代码中找到第一个运算符?

2 个答案:

答案 0 :(得分:0)

常见的解决方案是使用解析技术(如递归下降解析器)构建树。

您可以在语法中隐含操作顺序。

Expression :== Term | Expression ( '+' | '-' ) Term
Term :== Factor | Term ( '*' | '/' ) Factor
Factor :== value | '(' Expression ')'

您必须稍微重新排列语法以避免左递归。一旦你这样做,你可以通过为每个语法规则(例如,ParseExpression,ParseTerm和ParseFactor)编写一个函数来编写递归下降语法,该函数获取输入中的当前位置并返回一个新的树节点。

通过使用输入的开头调用ParseExpression启动解析器,然后您将返回树的根节点。

答案 1 :(得分:0)

假设这是一项编程练习,因此lecyacc和标准算法(如Shunting yard algorithm)的标准工具包不可用。

问题是如何找到顶部减号。要做那个计数括号。为每个开括号添加一个,为每个右括号减去一个。在此示例中,-是唯一一个计数为1的运算符。在C中假设您有一个字符串s。在C中,这将是一个简单的循环字符串循环。

这不是构建树的最有效方法。您可以一次扫描输入的一个字符,构建部分树,并跟踪深度。