题目来源
题目描述
题目解析
class Solution {
struct info{
long eval;
int idx;
info(long eval, int idx) : eval(eval), idx(idx){
}
};
void addDeque(std::deque<std::string> &deque, long num){
deque.push_back(std::to_string(num));
}
void addDeque(std::deque<std::string> &deque, char sign){
if(sign == '+'){
deque.emplace_back("+");
}else{
deque.emplace_back("-");
}
}
long evalDeque(std::deque<std::string> &deque){
long ans = 0;
bool isAdd = true;
std::string path = "0";
while (!deque.empty()){
auto str = deque.front(); deque.pop_front();
if(str == "+"){
isAdd = true;
}else if(str == "-"){
isAdd = false;
}else{
ans = isAdd ? ans + stol(str) : ans - stol(str);
}
}
return ans;
}
info * process(string str, int idx){
long curr = 0, N = str.size(), i = idx;
std::deque<std::string> deque;
while (i < N && str[i] != ')'){
if(str[i] == ' '){
i++;
}else if(str[i] == '+' || str[i] == '-'){
addDeque(deque, curr);
addDeque(deque, str[i]);
curr = 0;
i++;
}else if(str[i] >= '0' && str[i] <= '9'){
curr = curr * 10 + str[i] - '0';
i++;
}else if(str[i] == '('){
auto info = process(str, i + 1);
curr = info->eval;
i = info->idx + 1;
}
}
addDeque(deque, curr);
long eval = evalDeque(deque);
return new info(eval, i);
}
public:
int calculate(string s){
return (int)process(s, 0)->eval;
}
};
类似题目