1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
//解析器模式 #include <iostream> #include <map> #include <stack>
using namespace std;
class Expression { public: virtual int interpreter(map<char, int> var)=0; virtual ~Expression(){} };
//变量表达式 class VarExpression: public Expression {
char key;
public: VarExpression(const char& key) { this->key = key; }
int interpreter(map<char, int> var) override { return var[key]; }
};
//符号表达式 class SymbolExpression : public Expression {
// 运算符左右两个参数 protected: Expression* left; Expression* right;
public: SymbolExpression( Expression* left, Expression* right): left(left),right(right){
}
};
//加法运算 class AddExpression : public SymbolExpression {
public: AddExpression(Expression* left, Expression* right): SymbolExpression(left,right){
} int interpreter(map<char, int> var) override { return left->interpreter(var) + right->interpreter(var); }
};
//减法运算 class SubExpression : public SymbolExpression {
public: SubExpression(Expression* left, Expression* right): SymbolExpression(left,right){
} int interpreter(map<char, int> var) override { return left->interpreter(var) - right->interpreter(var); }
};
Expression* analyse(string expStr) {
stack<Expression*> expStack; Expression* left = nullptr; Expression* right = nullptr; for(int i=0; i<expStr.size(); i++) { switch(expStr[i]) { case '+': // 加法运算 left = expStack.top(); right = new VarExpression(expStr[++i]); expStack.push(new AddExpression(left, right)); break; case '-': // 减法运算 left = expStack.top(); right = new VarExpression(expStr[++i]); expStack.push(new SubExpression(left, right)); break; default: // 变量表达式 expStack.push(new VarExpression(expStr[i])); } }
Expression* expression = expStack.top();
return expression; }
void release(Expression* expression){
//释放表达式树的节点内存... }
int main(int argc, const char * argv[]) {
string expStr = "a+b-c+d-e"; map<char, int> var; var.insert(make_pair('a',5)); //a=5 var.insert(make_pair('b',2)); //b=2 var.insert(make_pair('c',1)); //c=1 var.insert(make_pair('d',6)); //d=6 var.insert(make_pair('e',10)); //e=10
Expression* expression= analyse(expStr);
int result=expression->interpreter(var);
cout<<result<<endl;
release(expression);
return 0; }
|
近期评论