首先遍历整个字符串,找到括号外的运算符号的位置并统计括号的个数。如果字符串中没有运算符号那么就有三种情况,第一种是全是括号,第二种是全是数字,第三种是括号和数子的组合。如果存在运算符就递归调用函数进行对应的运算符操作

#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);
}