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

时间:2012-01-01 19:47:56

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

面试问题。

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

例如。给出

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

我的想法:

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

更好的想法?

感谢

4 个答案:

答案 0 :(得分:3)

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

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

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

使用堆栈http://www.cs.wcupa.edu/~rkline/DS/deque-stack-algorithms.html

参考算术表达式的评估

答案 1 :(得分:0)

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

整数 - >整数令牌

运营商 - >操作员令牌

open-bracket - >州 - 新表达

结束括号 - >州 - 关闭表达

通过这种方式你可以构建树并通过展开树底来执行。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在包含在一对额外括号中的表达式之前添加字符串"print ",在末尾添加分号并将其传递给perl -e,即在C中:

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