问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
#include <iostream>
#include <stack>
using namespace std;
stack<char> a;
stack<int> num;
int bj(char a){
if(a == '+') return 1;
if(a == '-') return 1;
if(a == '*') return 2;
if(a == '/') return 2;
if(a == '(') return -1;
}
int int_pow(int x, int y){
int sum = 1;
for(int i = 0; i < y; i++){
sum *= x;
}
return sum;
}
int change(string s){
int num = 0;
for(int i = s.length() - 1, j = 0; i >= 0; i--, j++){
num += (s[i] - '0') * int_pow(10, j);
}
return num;
}
int act(int a, int b, char op){
int result;
switch(op){
case '+':result = a + b;
break;
case '-':result = a - b;
break;
case '*':result = a * b;
break;
case '/':result = a / b;
break;
}
return result;
}
int main(){
string s;
cin>>s;
s = s + '#';
char op;
int fir, sco, result;
for(int i = 0; i < s.length(); i++){
string s1 = "";
if(s[i] >= '0' && s[i] <= '9'){
while(s[i] >= '0' && s[i] <= '9'){
s1 += s[i];
i++;
}
int k = change(s1);
num.push(k);
i--;
} else {
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '('){
if(a.empty()){
a.push(s[i]);
} else {
if(bj(a.top()) == -1 || bj(s[i]) == -1){
a.push(s[i]);
} else if(bj(a.top()) < bj(s[i])){
a.push(s[i]);
} else {
op = a.top();
a.pop();
a.push(s[i]);
sco = num.top();
num.pop();
fir = num.top();
num.pop();
result = act(fir, sco, op);
num.push(result);
}
}
} else {
if(s[i] == ')'){
op = a.top();
a.pop();
if(a.top() == '('){
a.pop();
sco = num.top();
num.pop();
fir = num.top();
num.pop();
result = act(fir, sco, op);
num.push(result);
} else {
while(a.top() != '('){
sco = num.top();
num.pop();
fir = num.top();
num.pop();
result = act(fir, sco, op);
num.push(result);
op = a.top();
a.pop();
}
a.pop();
sco = num.top();
num.pop();
fir = num.top();
num.pop();
result = act(fir, sco, op);
num.push(result);
}
} else {
}
}
}
}
while(a.size() > 0){
op = a.top();
a.pop();
fir = num.top();
num.pop();
sco = num.top();
num.pop();
result = act(fir, sco, op);
num.push(result);
}
result = num.top();
cout<<result<<endl;
return 0;
}