当前位置: 首页 > 面试题库 >

支持Postfix的功能支持

柳才良
2023-03-14
问题内容

网上有很多算法可以将中缀转换为后缀。但是我的问题是如何使它支持功能?例如sin(x + y)* z。

我将欣赏代码。


问题答案:

如果您正在寻找一种算法,可以为您提供转换后缀到后缀的转换,包括对函数调用的支持,则可以使用下面的伪代码(看起来像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)


 类似资料:
  • 编辑:因为人们仍然从google登陆这里,你必须在OpenGL环境中调用每一个OpenGL方法。因此,在使用GL做任何事情之前,请确保您在一个上下文中。 我试图用lwjgl在我的屏幕上呈现一个简单的文本,但是每次都失败了!当我启动游戏时,它崩溃了,并向我抛出错误: 我需要使用现代openGL还是什么?我真的需要帮助

  • 问题内容: Node.js是否已经支持=>函数关键字别名?如果是,请从哪个版本开始?如何启用此语言扩展? 成为 问题答案: 简而言之:是的,自版本4.4.5起,Node.js中就很好地支持箭头功能。 完全正确的支持从版本6开始。最初的支持是从v0.12开始引入的,但是它非常不完整,默认情况下处于禁用状态,直到v4.0变得更好为止。

  • 这是我在私人网络中的简单合同 我已经使用web3J生成了智能合同包装器,功能如下 当我试图访问我的合同功能时,如 它给了我一个例外 请帮忙。

  • 问题内容: 我试图将项目从Eclipse迁移到Android Studio。终于我能够运行它了,但是在某个时候我遇到了这个异常,而我在谷歌上对此一无所获: 73. MainActivity行是: 请给我建议。 问题答案: 替代@sbaar的答案, 保持到并加入以及和它设置为。 即

  • 功耗节省简介 在空闲任务中放置处理器的低功耗模式代码是常用的节省功耗的一种方式。功耗节省可以通过这种简单的方式实现,但是受限于需要周期性的退出并且重新进入低功耗模式去处理节拍中断。但是如果节拍中断的频率很高,不断的退出和重新进入低功耗模式可能会潜在的导致功耗节省达不到预期效果。 freeRTOS的低节拍空闲模式可以停止周期性的节拍中断,在节拍中断重新开始时修正RTOS的节拍计数值。 停止节拍中断允

  • 功能矩阵 remote commit_push pull_request private_repo set_commit_status tag_build GitHub true true true true true Bitbucket true false true false true Coding true false true false true GitLab true false t

  • 我试图将Spring Cloud Stream与本主题中描述的功能一起使用。但是它不起作用。 我的职能: 我推送消息。通过使用输出注释制作的生产者,发送到consumer-in-0频道: 我的yaml通道配置: 如果我通过配置使用消费者,一切正常。同样在rabbitmq管理器中,我看到生产者正在工作并发送消息,但消费者并不使用它们。帮帮我,请某人帮忙。 附言:我也使用Spring WebFlux

  • 我已经研究这个问题好几天了,决定在这里问这个问题,看看是否有人能帮我指出正确的方向。 我试图用MS Access 2013表格中的数据填充我的Netbeans 8.0.2程序中的组合框。 我正在使用最新的“Ucanaccess”及其所有必要的组件来获取两者之间的连接,据我所知,连接是好的。然而,当我运行程序时,它会弹出一条错误异常消息,内容如下: 就这样-没有其他字母、字符、数字。。。没有什么 我