华为机考题——HJ54 表达式求值
描述
给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。
数据范围:运算过程中和最终结果均满足 |val| le 2^{31}-1 ∣val∣≤231−1 ,即只进行整型运算,确保输入的表达式合法
输入描述:
输入算术表达式
输出描述:
计算出结果值
示例1
输入:
400+5
复制输出:
405
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <vector>
//2323*323/23+(23234-(40-3)*3)*434-23
int computer(std::string str, int left, int right)
{
char option = +;
int sum = 0;
std::vector<int> sumVect;
for(int i = left; i <= right; ++i)
{
if(std::isdigit(str[i]))
{
sum = sum * 10 + (str[i] - 0);
}
if(str[i] == ()
{
int layer = 0;
int tempi = i;
while(tempi <= right)
{
if(str[tempi] == ()
{
layer++;
}
else if(str[tempi] == ))
{
layer--;
if(0 == layer)
{
break;
}
}
tempi++;
}
sum = computer(str, i + 1, tempi - 1);
i = tempi + 1;
}
if(!(std::isdigit(str[i])) || i == right)
{
switch (option)
{
case +:
sumVect.push_back(sum);
break;
case -:
sumVect.push_back(-sum);
break;
case *:
sumVect.back() *= sum;
break;
case /:
sumVect.back() /= sum;
break;
default:
break;
}
option = str[i];
sum = 0;
}
}
int rtn = 0;
for(int e : sumVect)
{
rtn += e;
}
return rtn;
}
int main()
{
std::string str;
while(std::cin >> str)
{
int rtn = computer(str, 0, str.length()-1);
std::cout << rtn << std::endl;
}
return 0;
}
