四则表达式求值

题目:openjudge 重庆十一中/寒假欢乐赛

来源:Guo Wei

http://cqsyz.openjudge.cn/hanjai/1/

总时间限制: 
1000ms
内存限制: 
65536kB
描述

求一个可以带括号的小学算术四则运算表达式的值

输入
一行,一个四则运算表达式。'*'表示乘法,'/'表示除法
输出
一行,该表达式的值,保留小数点后面两位
样例输入
输入样例1:
3.4
输入样例2:
7+8.3
输入样例3:
3+4.5*(7+2)*(3)*((3+4)*(2+3.5)/(4+5))-34*(7-(2+3))
样例输出
输出样例1:
3.40
输出样例2:
15.30
输出样例3:
454.75
用两个栈分别保存操作符和操作数,判断操作符优先级。
#include 
#include 
#include 
using namespace std;
int optonum(char x){
    switch (x) {
        case '*':
            return 0;
        case '/':
            return 1;
        case '+':
            return 2;
        case '-':
            return 3;
        case '(':
            return 4;
        case ')':
            return 5;
        default:
            return -1;
    }
}
int com[6][6]={
    1,1,1,1,0,1,
    1,1,1,1,0,1,
    0,0,1,1,0,1,
    0,0,1,1,0,1,
    0,0,0,0,0,-1,
    1,1,1,1,1,1
};
int main(){
    string str;
    while(cin>>str){
        stack st1;
        stack st2;
        int t=0;
        while(str[t]!='\0'){
            if(isdigit(str[t])||str[t]=='.'){
                double num;
                string s="";
                do{
                    s+=str[t++];
                }while(isdigit(str[t])||str[t]=='.');
                istringstream iss(s);
                iss>>num;
                st1.push(num);
            }else{
                if(st2.empty())
                    st2.push(str[t++]);
                else{
                    double x1,x2,x;
                    char op;
                    switch(com[optonum(st2.top())][optonum(str[t])]){
                        case 1:
                            x2=st1.top();
                            st1.pop();
                            x1=st1.top();
                            st1.pop();
                            op=st2.top();
                            st2.pop();
                            switch(op){
                                case '+':
                                    x=x1+x2;
                                    st1.push(x);
                                    break;
                                case '-':
                                    x=x1-x2;
                                    st1.push(x);
                                    break;
                                case '*':
                                    x=x1*x2;
                                    st1.push(x);
                                    break;
                                case '/':
                                    x=x1/x2;
                                    st1.push(x);
                                    break;
                                default:
                                    break;
                            }
                            break;
                        case 0:
                            st2.push(str[t++]);
                            break;
                        default:
                            st2.pop();
                            t++;
                            break;
                    }
                }
            }
        }
        while(!st2.empty()){
            char op=st2.top();
            st2.pop();
            double x1,x2,x;
            x2=st1.top();
            st1.pop();
            x1=st1.top();
            st1.pop();
            switch(op){
                case '+':
                    x=x1+x2;
                    st1.push(x);
                    break;
                case '-':
                    x=x1-x2;
                    st1.push(x);
                    break;
                case '*':
                    x=x1*x2;
                    st1.push(x);
                    break;
                case '/':
                    x=x1/x2;
                    st1.push(x);
                    break;
                default:
                    break;
            }
        }
        printf("%.2f\n",st1.top());
        st1.pop();
    }
    return 0;
}

你可能感兴趣的:(acm)