2014-01-13 27 views
0

我无法将转换中缀表达式转换为后缀,因为我无法正确放置括号。例如考虑:3+4*5/6如何将括号手动放入中缀表达式中?

从左到右我注意到具有更高优先级的'*'。因此,我提出:3+(4*5)/6

而且我观察“/”这样的:(3+(4*5))/6

但是,这是给我一个错误的定位后的表达。请在我的方法中指出错误,然后放上括号。

+2

是不是应该是3 +((4 * 5)/ 6)而不是(3+(4 * 5))/ 6? – adrin

+0

但是。把它转换成这种形式的逻辑是什么? –

+1

由于您未指定用于放置括号的方法(算法),因此不可能指出其中的错误。 (当然,*结果*显然是不正确的,但你自己也很了解。) – user4815162342

回答

0

您需要解析不同的词汇(词法/语法分析)并生成一种抽象语法树的形式。从这一点开始,您可以将表达式输出到修复后符号。

例如,解析表达式由左到右,没有任何前瞻:

  • 您解析3,该值存储为一个操作数
  • 您解析+,发现这是一个除了
  • 您解析4,将其作为操作数存储
  • 您解析了*,新运算符的优先级高于当前运算符(+),因此您必须将la第一步,创建一个新的上下文,并为此新操作符的操作数添加4
  • 你解析5,其存储为一个操作数
  • 您解析/,具有相同的优先级新的运营商,应该只有在*所以你关闭当前上下文并创建一个新的englobing这一块,这是执行用作第一个操作数。
  • 最后,您解析了第二个操作数6

最后,你从内环境中打开,把运营商,然后操作,插入括号并做相同的外部情境:

  • 4 5 *
  • 4 5 * 6 /
  • 4 5 * 6/3 +

或者用前缀记法:

  • * 4 5
  • / (* 4 5) 6
  • + (/ (* 4 5) 6) 3

在你的问题,你把括号整个前面的部分,而不是只有以前的操作围绕/操作。

+0

这是我在这里做的,不是?你确实可以忽略不同的操作数,然后在编写后缀表示法时再次读取它们,但它需要两次更长的解析。 – Geoffroy

+0

先生,我已删除评论。我在你编辑答案之前就已经写好了。 –

+0

先生,答案不应该是“3 4 5 * 6/+”吗? –

相关问题