(算法)求表达式(含括号)的值

题目:

求字符串表达式的值,如"-2+(3+4)-5*6",返回-25.

思路:

分离数字和运算符并考虑运算符的优先级,如(),*,/,+,-等。

两个栈:一个存数字,一个存运算符

代码:

#include<iostream>
#include<stack>
#include<sstream>
#include<string>
using namespace std;

double calc(double a,char op,double b){
    if(op=='+')
        return a+b;
    if(op=='-')
        return a-b;
    if(op=='*')
        return a*b;
    if(op=='/')
        return a/b;
}

bool isdigit(char s){
    int a=s-'0';
    if(a>=0 && a<=9)
        return true;
    return false;
}

template<class out_T,class in_T>
out_T convert(const in_T &t){
    stringstream ss;
    out_T result;
    ss<<t;
    ss>>result;
    return result;
}

int main(){
    string s;
    double x,y;
    char op;
    int priv[300];
    priv['+']=priv['-']=2;
    priv['*']=priv['/']=1;
    priv['(']=10;

    while(cin>>s){
        stack<double> num;
        stack<char> oper;
        int len=s.size();
        int start=0;    
        string str;
        char last=0;

        for(int i=0;i<len;i++){
            if(isdigit(s[i])){
            //    num.push(s[i]-'0');
                start=i;
                for(;i+1<len && (isdigit(s[i+1]) || s[i+1]=='.');i++);
                str=s.substr(start,i-start+1);
                num.push(convert<double>(str));
            }
            else if(s[i]=='('){
                oper.push(s[i]);
            }
            else if(s[i]==')'){
                while(!oper.empty() && oper.top()!='('){
                    x=num.top();
                    num.pop();
                    y=num.top();
                    num.pop();
                    op=oper.top();
                    oper.pop();
                    num.push(calc(x,op,y));
                }
                oper.pop();
            }
            else if(s[i]=='-' && (last==0 || last=='(')){
                num.push(0.0);
                oper.push('-');
            }
            else if(priv[s[i]]>0){
                while(oper.size()>0 && priv[s[i]]>=priv[oper.top()]){
                    y=num.top();
                    num.pop();
                    x=num.top();
                    num.pop();
                    op=oper.top();
                    oper.pop();
                    num.push(calc(x,op,y));
                }
                oper.push(s[i]);
            }
            else
                continue;
            last=s[i];
        }
        while(oper.size()>0){
            y=num.top();
            num.pop();
            x=num.top();
            num.pop();
            op=oper.top();
            oper.pop();
            num.push(calc(x,op,y));
        }
        cout<<num.top()<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/AndyJee/p/4907682.html