首先遍历整个字符串,找到括号外的运算符号的位置并统计括号的个数。如果字符串中没有运算符号那么就有三种情况,第一种是全是括号,第二种是全是数字,第三种是括号和数子的组合。如果存在运算符就递归调用函数进行对应的运算符操作
#include <iostream>
#include <cmath>
using namespace std;
string s;
int print(int l,int r) {
int num = 0;
for (int i = l; i <= r; i++) {
num = num * 10 + s[i] - '0';
}
return num;
}
int calc(int l,int r) {
if (l > r)return 0;
int pos1 = -1, pos2 = -1,pos3 = -1;//pos1记录+ - 的位置,pos2记录* / 的位置 pos3 记录^的位置
int cnt = 0;
for (int i = l; i <= r; i++) {
if (s[i] == '(')cnt++;
if (s[i] == ')')cnt--;
if ((s[i] == '+'||s[i]=='-')&& cnt == 0)pos1 = i;
if ((s[i] == '*' || s[i] == '/') && cnt == 0)pos2 = i;
if (s[i] == '^' && cnt == 0) pos3 = i;
}
//cout << pos1 << " " << pos2 << " " << pos3 << endl;
if (pos1 == -1 && pos2 == -1 && pos3 == -1) {
if (cnt > 0 && s[l] == '(')return calc(l + 1, r);
else if (cnt < 0 && s[r] == ')')return calc(l, r - 1);
else if (cnt == 0 && s[l] == '(' && s[r] == ')')return calc(l + 1, r - 1);
else return print(l,r);
}
if (pos1 != -1) {
if (s[pos1] == '+')return calc(l, pos1 - 1) + calc(pos1 + 1, r);
if (s[pos1] == '-')return calc(l, pos1 - 1) - calc(pos1 + 1, r);
}else if (pos2 != -1) {
if (s[pos2] == '*')return calc(l, pos2 - 1) * calc(pos2 + 1, r);
if (s[pos2] == '/')return calc(l, pos2 - 1) / calc(pos2 + 1, r);
}else if (pos3 != -1) {
return (int)pow(calc(l, pos3 - 1), calc(pos3 + 1, r));
}
return 0;
}
int main()
{
cin >> s;
cout<<calc(0,s.length()-1);
}


京公网安备 11010502036488号