如果您正在寻找一种算法,可以为您提供转换后缀到后缀的转换,包括对函数调用的支持,则可以使用下面的伪代码(看起来像python代码)。我已经为我的案例编写了此文件,但尚未进行全面测试。如果您发现任何错误,请告诉我。
我也为此编写了Java实现。
另外,关于此实现的几点注意事项:
此算法假定infix中有令牌流。它不解析表达式字符串。因此,每个令牌都可以标识为 *** 作数,运算符,函数调用等。
有7种不同的令牌:
- X,Y等 *** 作数
- 左括号-(
- 右括号-)
- 运算子-+,*
- 函数调用开始-sin(
- 函数调用结束-sin(x )
- 逗号-,
- 函数调用开始用
[
算法中的字符表示,函数调用结束用表示]
。请注意,函数调用终止是与右括号不同的令牌,)
尽管它们可以在字符串表达式中用相同的字符表示。
每个运算符都是二进制运算符,其优先级和关联性是其通常的含义。
逗号
,
是一种特殊的二进制运算符,其优先级NEGATIVE INFINITY
和关联性为LEFT(与+和*相同)。逗号运算符用于分隔函数调用的参数。因此,对于函数调用:
f(a,b,c) first comma separates a and b second comma separates a,b and c So the postfix for the above will be ab,c,f
算法您可以将逗号运算符视为添加到列表函数,该函数将第二个参数添加到第一个参数指定的列表中,或者如果两个都是单个值,它将创建一个两个值的列表。
infix_to_postfix(infix): postfix = [] infix.add(')') stack = [] stack.push('(') for each token in infix: if token is operand: postfix.add(token) if token is '[': stack.push(token) else if token is operator: if stack is empty OR stack[top] is '(' or stack[top] is '[': stack.push(token) else if (operator)token['precedence'] > stack[top]['precedence'] OR ( (operator)token['precedence'] == stack[top]['precedence'] AND (operator)token['associativity') == 'RIGHT' ): stack.push(token) else postfix.add(stack.pop()) stack.push(token) else if token is '(': stack.push(token) else if token is ')': while topToken = stack.pop() NOT '(': postfix.add(topToken) else if token is ']': while True: topToken = stack.pop() postfix.add(topToken) if topToken is '[': break else if token is ',': while topToken = stack.peek() NOT '[': postfix.add(topToken) stack.pop() stack.push(token)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)