描述
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
数据范围:表达式计算结果和过程中满足 |val| \le 1000 \∣val∣≤1000 ,字符串长度满足 1 \le n \le 1000 \1≤n≤1000
输入描述:
输入一个算术表达式
输出描述:
得到计算结果
示例1
输入:
3+2*{1+2*[-4/(8-6)+7]}
复制输出:
25
#include <iostream>
#include <vector>
int fourArithmetic(std::string& str, int left, int right)
{
char op = '+';
std::vector<int> vec;
int sum = 0;
for(int i=left;i<=right;++i)
{
if(std::isdigit(str[i]))
{
sum = sum*10 + str[i] - '0';
}
if(str[i] == '{' || str[i] == '[' || str[i] == '(') //开始找子式
{
int layer = 0;
int j = i;
while(j <= right) //3+2*{1+2*[-4/(8-6)+7]}
{
if(str[j] == '{' || str[j] == '[' || str[j] == '(')
{
layer++;
}
if(str[j] == '}' || str[j] == ']' || str[j] == ')')
{
layer--;
if(0 == layer)
{
break;
}
}
j++;
}
sum = fourArithmetic(str, i+1, j-1);
i = j+1;
}
if(!(std::isdigit(str[i])) || i == right)
{
switch (op)
{
case '+':
vec.push_back(sum);
op = str[i];
break;
case '-':
vec.push_back(-sum);
op = str[i];
break;
case '*':
vec.back() *= sum;
op = str[i];
break;
case '/':
vec.back() /= sum;
op = str[i];
break;
default:
break;
}
sum = 0;
}
}
int rtn = 0;
for(int x : vec)
{
rtn += x;
}
return rtn;
}
int main()
{
std::string str;
getline(std::cin, str);
std::cout << fourArithmetic(str, 0, str.length()-1) << std::endl;
return 0;
}