Aug 16

C++表达式求值类(class expression) 不指定

felix021 @ 2008-8-16 23:54 [IT » 程序设计] 评论(0) , 引用(0) , 阅读(3493) | Via 本站原创 | |
不长不短,150左右的一个类。。
下面是源码:
#include<iostream>
#include<stack>
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(){
            stack<char>op;
            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;
            stack<double>num;
            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;
}




欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]