面试问题。
给定一串算术表达式,找到表达式的十进制值。
例如。给出
30*(5+10) is a string, its value is 450.
我的想法:
逐个解析每个符号,并将字符串重建为具有运算符优先级的表达式。但是,它没有效率,它是O(n ^ 2)甚至更糟。
更好的想法?
感谢
答案 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));'");