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

Given a string of arithmetic expression, find the decimal value of the expression.

本文关键字:表达式 字符串 十进制 一个      更新时间:2023-10-16

>面试问题。

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

例如 . 给定

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

我的想法:

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

更好的主意 ?

谢谢

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

然后计算 O(n( 时间内带有堆栈的后缀表达式。

在表达式计算期间,需要转换为 Postfix 才能确定运算符的优先级。

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

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

整数 -> 整数令牌

运算符 ->运算符令牌

左括号 ->状态 - 新表达式

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

这样,您就可以构建树并通过展平树 bottum 来执行。

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

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

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