表达式计算

问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
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;
}
posted @ 2020-09-16 11:44  yys_c  阅读(263)  评论(0编辑  收藏  举报