• 中綴表達式求值的兩種方法


    //遞歸法求中綴表達式的值
    
    int calc(int l,int r)
    {
        for(int i=r,j=0;i>=l;--i)
        {
            if(s[i]=='(') ++j;
            if(s[i]==')') --j;
            if(j=='0'&&s[i]=='+') return calc(l,i-1)+calc(i+1,r);
            if(j=='0'&&s[i]=='-') return calc(l,i-1)-calc(i+1,r);
        }
        for (int i = r, j = 0; i >= l; i--) {
    		if (s[i] == '(') j++;
    		if (s[i] == ')') j--;
    		if (j == 0 && s[i] == '*') return calc(l, i - 1) * calc(i + 1, r);
    		if (j == 0 && s[i] == '/') return calc(l, i - 1) / calc(i + 1, r);
    	}
        if(s[l]=='('&&s[r]==')') return calc(l+1,r-1);
        int ans=0;
        for (int i = l; i <= r; i++) ans = ans * 10 + s[i] - '0';
    	return ans;
    }
    
    //中綴表達式轉後綴表達式,同時求值
    
    vector<int>nums;
    vector<char>ops;
    
    int grade(char op)
    {
        switch(op)
        {
            case '(':
                return 1;
            case '+':
            case '-':
                return 2;
            case '*':
            case '/':
                return 3;
        }
        return 0;
    }
    
    void calc(char op)
    {
        int y=*nums.rbegin();
        nums.pop_back();
        int x = *nums.rbegin();
    	nums.pop_back();
        int z;
        switch(op)
        {
            case '+':
    		z = x + y;
    		break;
    	case '-':
    		z = x - y;
    		break;
    	case '*':
    		z = x * y;
    		break;
    	case '/':
    		z = x / y;
    		break;
        }
        nums.push_back(z);
    }
    
    int solve(string s)
    {
        nums.clear();
        ops.clear();
        int top=0,val=0;
        for(int i=0;i<s.size();++i)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                val=val*10+s[i]-'0';
                if (s[i+1] >= '0' && s[i+1] <= '9') continue;
                nums.push_back(val);
                val=0;
            }
            else if(s[i]=='(') ops.push_back(s[i]);
            else if(s[i]==')') {
                while(*ops.rbegin()!='(') {
                    calc(*ops.rbegin());
                    ops.pop_back();
                }
                ops.pop_back();
            }
            else {
                while(ops.size()&&grade(*ops.rbegin()) >= grade(s[i])) {
                    calc(*ops.rbegin());
                    ops.pop_back();
                }
                ops.push_back(s[i]);
            }
        }
        while(ops.size()) {
            calc(*ops.rbegin());
            ops.pop_back();
        }
        return *nums.begin();
    }
    //歸納為三個原則:1、括號內的先計算 2、無括號情況下,優先級高的先計算,優先級低的後計算 3、優先級相同時,如何計算都可以。
    
  • 相关阅读:
    树莓派上使用docker部署aria2,minidlna
    在Ubuntu上部署一个基于webrtc的多人视频聊天服务
    解决.net core3.1使用docker部署在Ubuntu上连接sqlserver报error:35的问题
    .Net Core in Docker
    .Net Core in Docker
    SQL Server in Docker
    使用Docker运行SQL Server
    Spring Boot 2.x(四):整合Mybatis的四种方式
    Spring Boot 2.x (一):HelloWorld
    yarn (npm) 切换设置镜像源
  • 原文地址:https://www.cnblogs.com/tztqwq/p/11347674.html
Copyright © 2020-2023  润新知