链接: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;
}