问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
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;
}