在最近的项目中希望使用一个简单的表达式计算功能, 网上有开源的库,但是体积庞大,编译链接缓慢。
所以最后还是自己实现了一个。 支持几乎所有的数学运算符, 以及<cmath> 内置的函数。
实现原理简述:
c++实现表达式计算的思路一般有两种, (此处使用的是后者。)
1. 使用面向对象的多态特性, 对每一种运算符实现一个表达式类, 类似
class Exp;
class AddExp:Exp;
class MulExp:Exp;
....
虚拟重载evaluate()求值函数, 在解析表达式的过程中构建一颗表达式树,同时根据运算符优先级对树做旋转。
2. 基于堆栈
使用两个栈 O 和 N, 一个存算符, 一个存操作数, 根据算符优先级出入栈。
线性扫描表达式, 比较当前算符 和栈顶算符的优先级(还要考虑结合性),如果后者优先级高, 则从数值栈顶取出元素并计算,然后把返回值入栈。
否则 操作符/操作数依次入栈
实例: 计算 1*2+3 具体过程
依次入栈
push 1; push *; push 2
此时栈内元素如下, 下一个算符为'+'
N |1|2|
O
所以最后还是自己实现了一个。 支持几乎所有的数学运算符, 以及<cmath> 内置的函数。
实现原理简述:
c++实现表达式计算的思路一般有两种, (此处使用的是后者。)
1. 使用面向对象的多态特性, 对每一种运算符实现一个表达式类, 类似
class Exp;
class AddExp:Exp;
class MulExp:Exp;
....
虚拟重载evaluate()求值函数, 在解析表达式的过程中构建一颗表达式树,同时根据运算符优先级对树做旋转。
2. 基于堆栈
使用两个栈 O 和 N, 一个存算符, 一个存操作数, 根据算符优先级出入栈。
线性扫描表达式, 比较当前算符 和栈顶算符的优先级(还要考虑结合性),如果后者优先级高, 则从数值栈顶取出元素并计算,然后把返回值入栈。
否则 操作符/操作数依次入栈
实例: 计算 1*2+3 具体过程
依次入栈
push 1; push *; push 2
此时栈内元素如下, 下一个算符为'+'
N |1|2|
O