我只使用函数调用和整数从Infix表示法转换为Postfix表示法(只有字母,数字,逗号,括号和空格)。
例如,add(add(1,2),add(3,4))
到1 2 add 3 4 add add
输入表达式长22个字符,输出19,缩短3个。
sqrt(add(5,11))
至5 11 add sqrt
。
输入表达式长15个字符,输出13,缩短2个。
Postfix表示法总是会被字符数量等于函数量吗?
答案 0 :(得分:3)
中缀是否需要更多语法?这是一个有趣的问题。但是,您提供的示例是前缀表示法,而不是中缀。简而言之:是的,在某些情况下,中缀可以需要更多语法(例如,消除运算符优先级的歧义)。
我认为计算必要的令牌可能比计算字符更有意义。让我们看看会发生什么。
在前缀示例中,通过将开头的parens移动到运算符的左侧并用空格替换逗号,我们有Lisp:(+ (+ 1 2) (+ 3 4))
和(sqrt (+ 5 11))
。
然后我们可以简单地撤消所有内容并使用后缀表示法(但不会减少令牌或字符数):((1 2 +) (3 4 +) +)
和((5 11 +) sqrt)
。
鉴于arity已修复(+
为二进制,sqrt
为一元),我们可以明确删除parens并使其具有Forth:1 2 + 3 4 + +
和5 11 + sqrt
。实际上,对于固定的arity操作员,在任何情况下都不需要parens。他们从来都不是有意义的,必要的代币。
但是中缀是否需要更多语法?嗯,由于运算符优先级,此2 × (3 + 4)
与2 × 3 + 4
不同。必须使用parens 来表示中缀表示法的优先级。无论您选择何种语法,都必须添加某些以消除歧义。但是在后缀(或前缀)中,这两个表达式可以用相同的令牌计数明确表示(并且始终少于中缀):2 3 × 4 +
和2 3 4 + ×
或3 4 + 2 ×
。
我希望能回答你的目标!