支持Postfix的功能支持

支持Postfix的功能支持,第1张

支持Postfix的功能支持

如果您正在寻找一种算法,可以为您提供转换后缀到后缀的转换,包括对函数调用的支持,则可以使用下面的伪代码(看起来像python代码)。我已经为我的案例编写了此文件,但尚未进行全面测试。如果您发现任何错误,请告诉我。

我也为此编写了Java实现。

另外,关于此实现的几点注意事项:

  1. 此算法假定infix中有令牌流。它不解析表达式字符串。因此,每个令牌都可以标识为 *** 作数,运算符,函数调用等。

  2. 有7种不同的令牌:

    • X,Y等 *** 作数
    • 左括号-(
    • 右括号-)
    • 运算子-+,*
    • 函数调用开始-sin(
    • 函数调用结束-sin(x
    • 逗号-,
    • 函数调用开始用
      [
      算法中的字符表示,函数调用结束用表示
      ]
      。请注意,函数调用终止是与右括号不同的令牌,
      )
      尽管它们可以在字符串表达式中用相同的字符表示。
  3. 每个运算符都是二进制运算符,其优先级和关联性是其通常的含义。

  4. 逗号

    ,
    是一种特殊的二进制运算符,其优先级
    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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5013537.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存