zoukankan      html  css  js  c++  java
  • 表达式计算

    问题描述
      输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
    输入格式
      输入一行,包含一个表达式。
    输出格式
      输出这个表达式的值。
    样例输入
    1-2+3*(4-5)
    样例输出
    -4
    数据规模和约定
      表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

    算符优先文法的应用

    #include<iostream>
    using namespace std;
    
    const int N = 110;
    
    char sb[N], pp = -1;
    int dg[N], qq = -1;
    
    int cmp(char a, char b){
        if(a == '(') return 0;
        if(b == ')') return 1;
        if(b == '(') return 0;
        
        if(a == b) return 1;
        if(a == '*' || a == '/') return 1;
        if(b == '*' || b == '/') return 0;
        
        return 1;
    }
    
    int calc(int a, int b, char op){
         switch(op){
            case '+': return a + b; 
            case '-': return b - a; 
            case '*': return a * b; 
            case '/': return b / a;
        }
    }
    
    int solve(string &s){
        int i = 0, len = s.size();
        while(i < len){
            int p = 0;
            while(i < len && s[i] >= '0' && s[i] <= '9') 
                p = p * 10 + s[i ++] - '0';
                
            if(p) dg[++ qq] = p;
            
            if(i < len)
                if(pp == -1) sb[++ pp] = s[i];
                else{
                    while(~pp && cmp(sb[pp], s[i]) && sb[pp] != '('){
                        int a = dg[qq --], b = dg[qq --];
                        dg[++ qq] = calc(a, b, sb[pp]);
                        pp --;
                    }
                    
                    if(s[i] == ')') pp --;
                    else sb[++ pp] = s[i];
                }
            i ++;
        }
        
        while(~pp){
            int a = dg[qq --], b = dg[qq --];
            dg[++ qq] = calc(a, b, sb[pp]);
            pp --;
        }
        
        return dg[0];
    }
    
    int main(){
        string s;
        cin >> s;
        
        cout << solve(s);
        
        return 0;
    }
    
  • 相关阅读:
    pip安装requests时报 Requirement already satisfied: requests in d:pythonpyth... 的问题解决
    渗透测试靶场
    Spring Security核心类关系图
    Spring security 5 Authorize Configuration
    固定技术栈
    redis 指定端口 启动
    Spring 获取当前activeProfile
    通过进程编号 查询 监听端口
    lombok 插件安装
    idea 快捷键设置
  • 原文地址:https://www.cnblogs.com/tomori/p/13678218.html
Copyright © 2011-2022 走看看