标题:C++表达式求值类(class expression) 出处:Felix021 时间:Sat, 16 Aug 2008 23:54:49 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1090 内容: 不长不短,150左右的一个类。。 下面是源码: #include #include using namespace std; class expression{ /* class expression by Felix021 usage: 1. expression exp1 = new expression; printf("%lf\n", exp1.eval("1+2+3")); //output 6 2. expression exp1 = new expression("1+2+3"); printf("%lf\n", exp1.eval()); //output 6 3. expression exp1 = new expression("1+2+3"); printf("%lf\n", exp1.eval()); //output 6 printf("%lf\n", exp1.eval("2*4")); //output 8 printf("%lf\n", exp1.eval()); //output 8 4. expression exp1 = new expression; if(exp1.getexp()){ cout << exp1; }else{ cout << "NULL expression" << endl; } */ private: static const int maxlen = 1024; char expr[maxlen], back[maxlen]; void mid2back(){ stackop; int i, j = 0; char t; for(i = 0; expr[i]; i++){ //cout << "Processing " << expr[i] << " @ " << i << endl; switch(expr[i]){ case '+': case '-': while(!op.empty()){ t = op.top(); if(t != '('){ back[j++] = t; op.pop(); }else{ break; } } op.push(expr[i]); break; case '*': case '/': while(!op.empty()){ t = op.top(); if(t == '*' || t == '/'){ back[j++] = t; op.pop(); }else{ break; } } op.push(expr[i]); break; case '(': op.push(expr[i]); break; case ')': while(!op.empty()){ t = op.top(); if(t != '('){ back[j++] = t; op.pop(); }else{ op.pop(); break; } } break; case ' ': break; default: if(expr[i] != '.' && !(expr[i] <= '9' && expr[i] >= '0')){ cout << "非法字符!" << endl; return; } while(expr[i] == '.' || (expr[i] <= '9' && expr[i] >= '0')){ back[j++] = expr[i++]; } back[j++] = '#'; i--; break; } } while(!op.empty()){ t = op.top(); back[j++] = t; op.pop(); } back[j] = 0; //cout << back << endl; } double getans(){ int i; stacknum; double a, b; for(i = 0; back[i]; i++){ //cout << "Processing " << back[i] << " @ " << i << endl; if(back[i] == '.' || (back[i] >= '0' && back[i] <= '9')){ ans = atof(back+i); num.push(ans); while(back[i+1] != 0 && back[i+1] != '#') i++; continue; } if(back[i] == '#')continue; b = num.top(); num.pop(); a = num.top(); num.pop(); switch(back[i]){ case '+': ans = a + b; break; case '-': ans = a - b; break; case '*': ans = a * b; break; case '/': if((b >= 0 && b < 1e-12) || (b <= 0 && b > -1e-12)){ cout << "除零错误!" << endl; ans = 1e1000; return ans; } ans = a / b; break; default: cout << "非法字符!" << endl; ans = 1e1000; return ans; } num.push(ans); } ans = num.top(); num.pop(); return ans; } double ans; public: expression(){ } expression(char *str){ int i; for(i = 0; str[i]; i++) expr[i] = str[i]; expr[i] = 0; } bool getexpr(){ if(fgets(expr, maxlen, stdin) != NULL){ int i; for(i = 0; expr[i] != '\n'; i++); expr[i] = 0; if(i == 0) return false; else return true; } return false; } friend inline ostream & operator<<(ostream &os, expression &a){ a.eval(); os << a.ans; return os; } double eval(char *str){ int i; for(i = 0; str[i]; i++) expr[i] = str[i]; expr[i] = 0; mid2back(); return getans(); } double eval(){ mid2back(); return getans(); } }; int main(){ expression expr1; while(expr1.getexpr()){ cout<< expr1 << endl; } return 0; } Generated by Bo-blog 2.1.0