算法训练 表达式计算
时间限制:1.0s 内存限制:256.0MB
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
int bijiao(char x){
switch(x){
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
case '(': return -1;
case '#': return 0;
}
return 0;
}
int f(string str){
int ans = 0;
stack <char> cst;
stack <int> ist;
str += '#';
cst.push('#');
int i = 0, len = str.length();
while(i < len){
if(str[i] >= '0' && str[i] <= '9'){
int sum = 0;
while(str[i] >= '0' && str[i] <= '9'){
sum = sum * 10 + (str[i] - '0');
i++;
}
if(cst.top() == '-'){ //将减号换为加一个负数
cst.pop();
cst.push('+');
sum = -sum;
}
ist.push(sum);
}
if(str[i] == '('){
cst.push(str[i]);
i++;
}
else if(str[i] == ')'){
while(cst.top() != '('){ //一直碰到左括号结束
char ch;
ch = cst.top();
cst.pop();
int a = ist.top();
ist.pop();
int b = ist.top();
ist.pop();
int x = 0;
if(ch == '+'){
x = b + a;
}
else if(ch == '-'){
x = b - a;
}
else if(ch == '*'){
x = b * a;
}
else if(ch == '/'){
x = b / a;
}
ist.push(x);
// i++;
}
cst.pop();
i++;
}
else if(bijiao(str[i]) >= bijiao(cst.top())){ //优先级高的直接入栈
cst.push(str[i]);
i++;
}
else if(bijiao(str[i]) < bijiao(cst.top())){
while(bijiao(str[i]) < bijiao(cst.top())){ //直到当前的符号优先级比栈顶优先级高,才入栈,否则一直运算
char ch;
ch = cst.top();
cst.pop();
int a = ist.top();
ist.pop();
int b = ist.top();
ist.pop();
int x = 0;
if(ch == '+'){
x = b + a;
}
else if(ch == '-'){
x = b - a;
}
else if(ch == '*'){
x = b * a;
}
else if(ch == '/'){
x = b / a;
}
ist.push(x);
}
cst.push(str[i]);
i++;
}
}
return ist.top();
}
int main(){
string str;
cin >> str;
cout << f(str) << endl;
return 0;
}
浙公网安备 33010602011771号