先把表达式中所有的括号去掉,定义一个函数,对于每一对括号,截取字符串对应位置的子字符串,然后去掉括号并处理其中的内容,如果还有括号则继续使用此函数处理,直到其中没有括号为止,将所有去掉括号后的字符串拼接起来,然后按照四则运算的先后顺序计算出结果。
#include <cstddef>
#include <iostream>
using namespace std;
string calBracket(string s);
string calResult(const string & s);
int main() {
string s;
cin >> s;
s = calBracket(s);
cout << calResult(s);
}
string calculate(string s1, string s2, char operation) {
if (operation == '+') {
return to_string(stoi(s1) + stoi(s2));
} else if (operation == '-') {
return to_string(stoi(s1) - stoi(s2));
} else if (operation == '*') {
return to_string(stoi(s1) * stoi(s2));
} else if (operation == '/') {
return to_string(stoi(s1) / stoi(s2));
}
return NULL;
}
string calResult(const string & s) {
string ans;
string temp;
string temp2;
char operation;
for (int i = 0; i < s.length(); i++) {
if (s.at(i) == '+' || s.at(i) == '-') {
if (i > 0 && (s.at(i - 1) == '+' || s.at(i - 1) == '-' || s.at(i - 1) == '*' || s.at(i - 1) == '/')) {
temp += s.at(i);
continue;
}
if (operation == '*' || operation == '/') {
temp = calculate(temp2, temp, operation);
}
operation = s.at(i);
ans += temp;
ans += s.at(i);
temp.clear();
temp2.clear();
continue;
} else if (s.at(i) == '*' || s.at(i) == '/') {
if (!temp2.empty()) {
temp2 = calculate(temp2, temp, operation);
} else {
temp2 = temp;
}
temp.clear();
operation = s.at(i);
continue;
}
temp += s.at(i);
if (i == s.length() - 1) {
if (operation == '*' || operation == '/') {
temp = calculate(temp2, temp, operation);
}
ans += temp;
}
}
temp.clear();
temp2.clear();
for (int i = 0; i < ans.length(); i++) {
if (ans.at(i) == '+' || ans.at(i) == '-') {
if (i > 0 && (ans.at(i - 1) == '+' || ans.at(i - 1) == '-') || i == 0) {
temp += ans.at(i);
continue;
}
if (!temp2.empty()) {
temp2 = calculate(temp2, temp, operation);
} else {
temp2 = temp;
}
temp.clear();
operation = ans.at(i);
continue;
}
temp += ans.at(i);
if (i == ans.length() - 1) {
if (operation == '+' || operation == '-') {
if (!temp2.empty()) {
temp = calculate(temp2, temp, operation);
}
}
}
}
ans = temp;
return ans;
}
string calBracket(string s) {
string ans;
int start;
int end;
while (s.find('(') != string::npos || s.find('[') != string::npos || s.find('{') != string::npos) {
for (int i = 0; i < s.length(); i++) {
if (s.at(i) == '{') {
start = i + 1;
end = s.find('}', start);
ans += '[' + calBracket(s.substr(start, end - start)) + ']';
i = end;
continue;
} else if (s.at(i) == '[') {
start = i + 1;
end = s.find(']', start);
ans += '(' + calBracket(s.substr(start, end - start)) + ')';
i = end;
continue;
} else if (s.at(i) == '(') {
start = i + 1;
int count = 1;
for (int j = start; j < s.length(); j++) {
if (s.at(j) == '(') {
count++;
} else if (s.at(j) == ')') {
count--;
}
if (count == 0) {
count = j;
break;
}
}
end = count;
if (s.substr(start, end - start).find('(') != string::npos) {
ans += '(' + calBracket(s.substr(start, end - start)) + ')';
} else {
ans += calResult(s.substr(start, end - start));
}
i = end;
continue;
}
ans += s.at(i);
}
s = ans;
ans.clear();
}
return s;
}
// 64 位输出请用 printf("%lld")



京公网安备 11010502036488号