C# 转换反向波兰符号 当使用C++或C语言时,有没有办法将反向波兰符号解释成“正常”数学符号?我在一家工程公司工作,所以他们偶尔会使用RPN,我们需要一种转换它的方法。有什么建议吗?

C# 转换反向波兰符号 当使用C++或C语言时,有没有办法将反向波兰符号解释成“正常”数学符号?我在一家工程公司工作,所以他们偶尔会使用RPN,我们需要一种转换它的方法。有什么建议吗?,c#,c++,rpn,C#,C++,Rpn,C#没有解析反向波兰符号(RPN)的内置支持。您需要编写自己的解析器,或者在线查找 有几十个将后缀形式(RPN)转换为中缀(代数方程)的教程。看一看,也许你会发现它很有用,你可以尝试“逆向工程”将后缀表达式转换成中缀形式,记住一个给定的后缀可以有多个中缀符号。实际上很少有有用的例子讨论如何将后缀转换为中缀。这里有一个由两部分组成的条目,我觉得非常有用。它还有一些伪代码: 是的。想想RPN计算器是如何工作的。现在,不再计算值,而是将操作添加到树中。因此,例如,234+*,当你到达+,然后不是

C#没有解析反向波兰符号(RPN)的内置支持。您需要编写自己的解析器,或者在线查找

有几十个将后缀形式(RPN)转换为中缀(代数方程)的教程。看一看,也许你会发现它很有用,你可以尝试“逆向工程”将后缀表达式转换成中缀形式,记住一个给定的后缀可以有多个中缀符号。实际上很少有有用的例子讨论如何将后缀转换为中缀。这里有一个由两部分组成的条目,我觉得非常有用。它还有一些伪代码:


  • 是的。想想RPN计算器是如何工作的。现在,不再计算值,而是将操作添加到树中。因此,例如,
    234+*
    ,当你到达+,然后不是把7放在堆栈上,而是把
    (+34)
    放在堆栈上。同样,当你到达*(你的堆栈在那个阶段看起来像
    2(+34)*
    ),它变成
    (*2(+34))

    这是前缀符号,然后必须将其转换为中缀。从左到右遍历树,深度优先。对于每个“内部级别”,如果运算符的优先级较低,则必须将操作放在括号中。在这里,你会说,
    2*(3+4)
    ,因为+的优先级低于*

    希望这有帮助

    编辑:有一个微妙之处(除了上面没有考虑一元运算):我假设了左联想运算符。对于右关联(例如,
    ***
    ),则会得到不同的结果⇒ <代码>(**2(**34))与
    23**4**
    ⇒ <代码>(**(23)4)

    从树中重建中缀时,这两种情况都表明优先级不需要括号,但实际上后一种情况需要括号(
    (2**3)**4
    )。因此,对于右关联运算符,左分支需要具有更高的优先级(而不是更高或相等),以避免括号


    此外,进一步的想法是,您需要为
    -
    /
    操作符的右侧分支使用括号。

    调车场算法用于将中缀(即代数)转换为RPN。这与你想要的正好相反


    你能给我一个RPN输入的例子吗?我是一名经验丰富的HP计算器用户/程序员。我假定您有一个包含所有输入和运算符的堆栈。我猜您需要重建表达式树,然后遍历该树以生成中缀形式。

    一种方法是以第二章中的示例为例,其中解释了如何编写解析器以将中缀符号转换为后缀符号,并将其反转

    如果您有一些源文本(字符串)要从RPN(后缀表示法)转换为“普通表示法”(中缀),这当然是可能的(而且可能不会太难)

    RPN是为基于堆栈的机器设计的,因为操作的表示方式(“2+3”->“2+3+”)适合它在硬件上实际执行的方式(将“2”推到堆栈上,将“3”推到堆栈上,将最上面的两个参数从堆栈中弹出,然后添加它们,再推回到堆栈上)

    基本上,您希望通过在“叶节点”和操作本身(后面的操作是“父节点”)上生成两个表达式,从而从RPN中创建一个语法树。这可能是通过递归地查看输入字符串来实现的(如果子表达式还没有被正确地插入到括号中,则可能需要确保子表达式被正确地插入到括号中,以便更加清晰)

    一旦你有了那个语法树,你就可以输出前缀、中缀或后缀符号,只需对那个树进行预序、后序或按序遍历(同样,如果需要的话,为了清晰起见,把输出括起来)


    可以找到更多的信息。

    如果你能阅读ruby,你会找到一些很好的解决方案。

    我刚刚用Java编写了一个版本,它是Objective-C,结束

    可能的算法:假设您有一个堆栈,其中包含用户输入的rpn中的输入,例如8、9、*。从第一个到最后一个遍历数组,始终删除当前元素。这是您评估的元素。如果是操作数,则将其添加到结果堆栈上。当它是一个运算符时,您会为操作数弹出两次结果堆栈(对于二进制操作),并在结果堆栈上写入结果字符串

    使用“8、9、+、2、*”的示例输入,您可以在resultstack上获得这些值(方括号表示单个元素):

    第1步:[8]

    第二步:[8],[9]

    第三步:[(8+9)]

    第四步:[(8+9)],[2]

    第五步:[(8+9)*2]

    当输入堆栈为空时,您就完成了,resultStack的唯一元素就是您的结果。(但是请注意,输入可能包含多个条目或没有意义的条目,如前导操作:“+23/”)

    链接中的实现故意不为运算符或操作数等使用任何自制类型,也不应用复合模式等。它简洁明了,因此易于理解并移植到任何其他语言


    将其移植到C#是很简单的。

    是的,创建表达式树正是正确的方法。:-)我的方法是先转换成前缀,但可能有直接到中缀的方法。链接讨论了如何将中缀转换成后缀,而不是相反……我已经更新了我的答案。而我却找不到确切的答案