【发布时间】: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
面试题。
给定一串算术表达式,求表达式的十进制值。
例如给定
30*(5+10) is a string, its value is 450.
我的想法:
逐个解析每个符号并将字符串重建为具有运算符优先级的表达式。但是,它效率不高,它是 O(n^2) 甚至更糟。
更好的想法?
谢谢
【问题讨论】:
标签: c++ string algorithm data-structures expression
您可以在 O(n) 时间内使用堆栈将表达式转换为后缀。
然后在 O(n) 时间内使用堆栈计算后缀表达式。
在表达式求值期间确定运算符的优先级需要转换为 Postfix。
使用堆栈http://www.cs.wcupa.edu/~rkline/DS/deque-stack-algorithms.html引用算术表达式的评估
【讨论】:
使用有限状态自动机解析和标记字符串:
整数 -> 整数令牌
操作员 -> 操作员令牌
opening-bracket -> state - 新表达式
右括号 -> 状态 - 关闭表达式
这样你就可以构建树并通过将树底部展平来执行。
【讨论】:
用交易术语描述操作:构建或查找算术表达式解析器、解析字符串、评估抽象语法树 (AST) 并返回结果。由于算术表达式是上下文无关语言并且在LL(1) 中,这在O(n) 中是可能的。使用 Boost.Spirit 或 yacc 构建解析器很便宜。
【讨论】:
将字符串"print "放在用一对额外括号括起来的表达式之前,在末尾放一个分号并将其传递给perl -e,即在C中:
system("perl -e 'print (30*(5+10));'");
【讨论】: