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


    题目:

    求字符串表达式的值,如"-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;
    }
  • 相关阅读:
    关于Java 拷贝数组方法 Arrays.copyOf() 是地址传递还是值传递
    n皇后问题
    子集
    排列
    矩阵翻转
    删除集合元素的方法
    Java最大值与最小值
    Spring Security +Oauth2 +Spring boot 动态定义权限
    VirtualBox Centos7虚拟机集群配置
    VirtualBox使用Centos7与主机共享文件夹
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4907682.html
Copyright © 2020-2023  润新知