Algorithm 以下哪个后缀符号正确表示中缀和1+;2+;3+;4.

Algorithm 以下哪个后缀符号正确表示中缀和1+;2+;3+;4.,algorithm,notation,infix-notation,postfix-notation,shunting-yard,Algorithm,Notation,Infix Notation,Postfix Notation,Shunting Yard,我正在测试中缀到后缀到中缀的转换器,发现了一些不确定性。例如,一个简单的中缀和 1 + 2 + 3 + 4 可以转换为后缀1 1 2 + 3 + 4 + 假设优先级相等的运算符不累加。如果是的话,我会得到 1 2 3 4 + + + 另一方面,以下所有后缀表达式都可以转换为初始和 1 2 + 3 + 4 + 1 2 + 3 4 + + 1 2 3 4 + + + 这些后缀表达式都正确吗 更新1 如果你想做这种转换器,你会选择哪种形式?我需要选择一个进行测试。是的,完全正确。它们对应于以下

我正在测试中缀到后缀到中缀的转换器,发现了一些不确定性。例如,一个简单的中缀和

1 + 2 + 3 + 4
可以转换为后缀1

1 2 + 3 + 4 +
假设优先级相等的运算符不累加。如果是的话,我会得到

1 2 3 4 + + +
另一方面,以下所有后缀表达式都可以转换为初始和

1 2 + 3 + 4 +
1 2 + 3 4 + +
1 2 3 4 + + +
这些后缀表达式都正确吗

更新1
如果你想做这种转换器,你会选择哪种形式?我需要选择一个进行测试。

是的,完全正确。它们对应于以下括号内的中缀表达式:

((1 + 2) + 3) + 4
(1 + 2) + (3 + 4)
1 + (2 + (3 + 4))

您需要定义一个额外的约束

从数学上讲,你的后缀表达式都是一样的。但在计算机上,由于溢出,整数加法实际上不是可交换的


用B C D替换1 2,3,4,并考虑溢出的可能性。大多数编程语言定义必须从左到右计算

a+b+c+d
,以便
a b+c+d+
是唯一正确的翻译


只有当您定义求值顺序为“未指定”时,所有后缀版本才是等效的。(较旧的)C编译器就是这种情况。

+
令人困惑-它是可交换的,因此事实上,每个结果似乎都是正确的

考虑将
+
替换为其他运算符:
1a2b3c4

对于左关联运算符,这里的正确结果是

1 2 a 3 b 4 c

所以,在你的情况下,我希望
12+3+4+

好的,没错。我的问题不清楚-我对转换感到好奇,而不是结果。:)要学究气,唯一严格正确的顺序是第一条。其他的是等价的,但只是因为加法是关联的。显然,他们都给出了相同的答案,但是1441++。乔:为什么1+2+3+4意味着((1+2)+3)+4,而不是说1+(2+(3+4))?是否有一些我从未听说过的惯例,中缀运算在默认情况下应该是从左到右计算的/是左关联的?(这在许多编程语言中都是如此,但它并不是通用的。)事实上,在数学中,所有操作都是从左到右执行的,并且受操作顺序的限制。再说一次,除此之外,这并不重要,但对于其他运算来说,它可能会发生。@Joel:我可以向你保证,在数学中,让运算保持关联性远非普遍性。举个例子:对于向量叉积,a×b×c更可能表示向量三重积a×(b×c),而不是(a×b)×c。函数组合f∘G∘h更可能表示f∘(g)∘h) than(f)∘(g)∘H根据惯例,甚至矩阵乘法ABC也可以表示(AB)C或A(BC)。因此,在指定了关联性之前(例如,通过吸引现有编程语言中的流行性,这里的三个选项中的第一个和最后一个似乎同样有效。:P)+1。重要的是,它们编译成与您争论的内容相同的内容。并不是像其他人所争论的那样,它们在数学上为+运算符工作。“大多数编程语言定义a+b+c+d必须从左到右求值”-为什么它与大多数编程语言所做的事情相关?OP没有指定编程语言,对于抽象的中缀表达式,我不知道有任何这样的从左到右的约定。不过,我同意OP需要定义求值顺序。@Shreev:语言部分是为了说明需要def这一点。最好重新阅读你的fav的评估规则。语言。它很重要。@Henk:给定一种编程语言,它很重要该编程语言做什么。当然我同意你的看法。但是在没有任何编程语言的情况下(如这里所示),我觉得仅仅根据大多数编程语言的实际操作得出结论不是一个好主意。:-)@什列夫:主要的一点是,
+
不是(真的)可交换的。我认为你对其余部分读得太多了。当然还有一个问题,即pre/postfix+可以是n元而不是二进制,因此1234+可能是一个有效的表达式