0.功能:
计算一个多层次表达式
例如:
(((((6)+(5)+(4))-(3))*(2))/(1)) = ?
((((1)or(0))xor(2))and(not(-1)))= ?
1.原理:
参考正则表达式解析,存储结构,和xml树形结构文件解析的思路,创建树形算式结构。
2.流程:
第一步:解析表达式
<1>.遇到'('创建一个节点。
<2>.遇到')'返回上一层。
<3>.遇到其他情况填值。
第二步:创建结构
结构图
3.应用
求解出一个复杂计算条件计算值,表达式的结果可以是数字量或者模拟量,可以抽象到复杂条件判断上面。
4.代码
symbol.h
1 #ifndef SYMBOL_H
2 #define SYMBOL_H
3
4 /*
5 symbol
6 各种运算符号的算法实现。做所有“正确”数据的计算。
7 */
8
9
10 #include <list>
11 #include <string>
12
13 using namespace std;
14
15
16 class ValSymbol
17 {
18 public:
19 ValSymbol(){}
20 virtual ~ValSymbol(){}
21 string SymbolContent() {return "val";}
22 double Operation(list<double>& values);
23 };
24
25 class AddSymbol
26 {
27 public:
28 AddSymbol(){
29
30 }
31 virtual ~AddSymbol(){}
32 string SymbolContent(){return "+";}
33 double Operation(list<double>& values);
34 };
35
36 class SubSymbol
37 {
38 public:
39 SubSymbol(){}
40 virtual ~SubSymbol(){}
41 string SymbolContent() {return "-";}
42 double Operation(list<double>& values);
43 };
44
45 class MulSymbol
46 {
47 public:
48 MulSymbol(){}
49 virtual ~MulSymbol(){}
50 string SymbolContent() {return "*";}
51 double Operation(list<double>& values);
52 };
53
54 class DivSymbol
55 {
56 public:
57 DivSymbol(){}
58 virtual ~DivSymbol(){}
59 string SymbolContent() {return "/";}
60 double Operation(list<double>& values);
61 };
62
63 class AndSymbol
64 {
65 public:
66 AndSymbol(){}
67 virtual ~AndSymbol(){}
68 string SymbolContent() {return "and";}
69 double Operation(list<double>& values);
70 };
71
72 class OrSymbol
73 {
74 public:
75 OrSymbol(){}
76 virtual ~OrSymbol(){}
77 string SymbolContent() {return "or";}
78 double Operation(list<double>& values);
79 };
80
81 class NotSymbol
82 {
83 public:
84 NotSymbol(){}
85 virtual ~NotSymbol(){}
86 string SymbolContent() {return "not";}
87 double Operation(list<double>& values);
88 };
89