C++ 给定一个算术表达式字符串,查找表达式的十进制值。
面试问题 给定一个算术表达式字符串,查找表达式的十进制值 e、 g。给定C++ 给定一个算术表达式字符串,查找表达式的十进制值。,c++,string,algorithm,data-structures,expression,C++,String,Algorithm,Data Structures,Expression,面试问题 给定一个算术表达式字符串,查找表达式的十进制值 e、 g。给定 30*(5+10) is a string, its value is 450. 我的想法是: 逐个解析每个符号,并将字符串重建为具有运算符优先级的表达式。但是,它不是有效的,它是O(n^2),甚至更糟 更好的主意 谢谢您可以在O(n)时间内使用堆栈将表达式转换为后缀 然后在O(n)时间内使用堆栈计算后缀表达式 在表达式求值期间,需要转换为后缀以确定运算符的优先级 请参阅使用堆栈评估算术表达式使用有限状态自动机解析并
30*(5+10) is a string, its value is 450.
我的想法是:
逐个解析每个符号,并将字符串重建为具有运算符优先级的表达式。但是,它不是有效的,它是O(n^2),甚至更糟
更好的主意
谢谢您可以在O(n)时间内使用堆栈将表达式转换为后缀 然后在O(n)时间内使用堆栈计算后缀表达式 在表达式求值期间,需要转换为后缀以确定运算符的优先级
请参阅使用堆栈评估算术表达式使用有限状态自动机解析并标记字符串: 整数->整数令牌 操作员->操作员令牌 打开括号->状态-新建表达式 右括号->状态-关闭表达式
这样,您就可以构建树并通过将树的底部展平来执行。用交易的方式描述操作:构建或找到算术表达式的解析器,解析字符串,计算抽象语法树(AST)并返回结果。由于算术表达式是上下文无关语言,在
LL(1)
中,这在O(n)
中是可能的。使用Boost.Spirit或yacc构建解析器的成本很低。在表达式包装在一对额外的括号中之前,在字符串前面加上一个分号,并将其传递给perl-e,即在C中:
system("perl -e 'print (30*(5+10));'");
堆栈: