我有一个家庭作业:当我们输入像-(2+3)*1/5这样的数学表达式时,输出应该是-1。在做了一些研究之后,我发现rpn算法是解决这个问题的方法。所以我做的是把表达式从中缀转换成后缀。但问题是,在某些情况下,我无法确定操作数,例如:

Input: 11+((10-2)*6)+7
Infix-to-Postfix-----------
Output: 11102-6*+7+

“11”和“10”之间以及“10”和“2”之间没有空格,因此我无法正确确定每个操作数。
因为我的输出(postfix)是一个字符串,所以我完全不知道如何解决这个问题有什么办法吗?

最佳答案

您在文章中描述了这个问题——以及显而易见的解决方案:您选择的postfix输出会破坏原始表达式中的关键信息。显而易见的解决方案是,您必须更改postfix例程以保留该信息。
特别的问题是,您不能再将一个数字字符串解析为原始整数最明显的解决办法是保留或插入一个唯一的分隔符。当发出(输出)整数时,添加某种标点符号。由于rpn只使用数字和少数运算符,所以请选择一些易于检测和阅读的内容:空格、逗号或其他对您有用的内容。
例如,如果使用一个简单的空格,那么rpn格式为

11 10 2 -6 *+7 +

当你在你的rpn计算器中读到这个时,使用分隔符作为“push integer”信号(或运算符)。
注意,我在每个整数上都使用了这个分隔符作为终端字符,而不仅仅是连续整数之间的分隔符。使其成为终端简化了输出处理和输入解析决定是否添加该符号只取决于一个令牌(整数),而不是使其成为两个相邻令牌的条件(需要少量上下文状态)。

09-11 19:54