【问题标题】:Given a string of arithmetic expression, find the decimal value of the expression.给定一串算术表达式,找出表达式的十进制值。
【发布时间】:2012-01-01 19:47:55
【问题描述】:

面试题。

给定一串算术表达式,求表达式的十进制值。

例如给定

 30*(5+10) is a string, its value is 450. 

我的想法:

逐个解析每个符号并将字符串重建为具有运算符优先级的表达式。但是,它效率不高,它是 O(n^2) 甚至更糟。

更好的想法?

谢谢

【问题讨论】:

标签: c++ string algorithm data-structures expression


【解决方案1】:

您可以在 O(n) 时间内使用堆栈将表达式转换为后缀。

然后在 O(n) 时间内使用堆栈计算后缀表达式。

在表达式求值期间确定运算符的优先级需要转换为 Postfix。

使用堆栈http://www.cs.wcupa.edu/~rkline/DS/deque-stack-algorithms.html引用算术表达式的评估

【讨论】:

    【解决方案2】:

    使用有限状态自动机解析和标记字符串:

    整数 -> 整数令牌

    操作员 -> 操作员令牌

    opening-bracket -> state - 新表达式

    右括号 -> 状态 - 关闭表达式

    这样你就可以构建树并通过将树底部展平来执行。

    【讨论】:

      【解决方案3】:

      用交易术语描述操作:构建或查找算术表达式解析器、解析字符串、评估抽象语法树 (AST) 并返回结果。由于算术表达式是上下文无关语言并且在LL(1) 中,这在O(n) 中是可能的。使用 Boost.Spirit 或 yacc 构建解析器很便宜。

      【讨论】:

        【解决方案4】:

        将字符串"print "放在用一对额外括号括起来的表达式之前,在末尾放一个分号并将其传递给perl -e,即在C中:

        system("perl -e 'print (30*(5+10));'");
        

        【讨论】:

          猜你喜欢
          • 2011-01-25
          • 1970-01-01
          • 2015-07-02
          • 1970-01-01
          • 1970-01-01
          • 2017-08-07
          • 1970-01-01
          • 2020-01-15
          相关资源
          最近更新 更多