链接:https://ac.nowcoder.com/acm/problem/50999

来源:牛客网

感谢雨神

题目描述

给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值

数据可能会出现括号情况,还有可能出现多余括号情况

数据保证不会出现>=2³¹的答案

数据可能会出现负数情况

输入描述:

仅一行,即为表达式

输出描述:

仅一行,既为表达式算出的结果

示例1

输入

(2+2)^(1+1)

输出

16
备注:

表达式总长度≤30


废话不多说,直接上代码
#include<bits/stdc++.h>
using namespace std;
string s;
int num(int l,int r)//把字符串转换成数字
{
    int ans=0;
    for(int i=l; i<=r; i++)
    {
        ans*=10;
        ans+=s[i]-'0';
    }
    return ans;
}
int solve(int l,int r)
{
    int pos1=-1,pos2=-1,pos3=-1;//pos1记录+-,pos2记录*/,pos3记录^
    int cnt=0;//记录括号
    if(l>r)return 0;
    if(l==r)return s[l]-'0';
    for(int i=l; i<=r; i++)
    {
        if(s[i]=='(')cnt++;
        if(s[i]==')')cnt--;
        if(cnt==0)
        {
            if(s[i]=='+'||s[i]=='-')pos1=i;
            if(s[i]=='*'||s[i]=='/')pos2=i;
            if(s[i]=='^')pos3=i;
        }
    }
    if(pos1==-1&&pos2==-1&&pos3==-1)
    {
        if(cnt>0&&s[l]=='(')return solve(l+1,r);
        else if(cnt<0&&s[r]==')')return solve(l,r-1);
        else if(cnt==0&&s[l]=='('&&s[r]==')')return solve(l+1,r-1);
        else return num(l,r);
    }
    if(pos1>=0)
    {
        if(s[pos1]=='+')return solve(l,pos1-1)+solve(pos1+1,r);
        else return solve(l,pos1-1)-solve(pos1+1,r);
    }
    else if(pos2>=0)
        if(s[pos2]=='*')return solve(l,pos2-1)*solve(pos2+1,r);
        else return solve(l,pos2-1)/solve(pos2+1,r);
    else if(pos3>=0)
        return pow(solve(l,pos3-1),solve(pos3+1,r));
    else return 0;
}
int main()
{
    cin>>s;
    cout<<solve(0,s.size()-1);
    return 0;
}