題目描述
給出一個表達式,其中運算符僅包含+,-,*,/,^要求求出表達式的最終值 數據可能會出現括號情況 還有可能出現多餘括號情況 數據保證不會出現> maxlongint的數據 數據可能回出現負數情況
輸入
僅一行,即爲表達式
輸出
僅一行,既爲表達式算出的結果
樣例輸入
(2+2)^(1+1)
樣例輸出
16
提示
表達式總長度< =30
ps:和上一個表達式求值思路類似,只不過加了括號(有不理解的可以去看上一個
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fun(char c)
{
if(c=='+') return 0;
else if(c=='-') return 1;
else if(c=='*') return 2;
else if(c=='/') return 3;
else return 4;
}
ll judge[5][5]={{0,0,1,1,1},{0,0,1,1,1},{-1,-1,0,0,1},{-1,-1,0,0,1},{-1,-1,-1-1,0}};
ll fun1(ll a,ll b,char c)
{
ll ans=1;
if(c=='+') ans=a+b;
else if(c=='-') ans = a - b;
else if(c=='*') ans = a * b;
else if(c=='/') ans = a / b;
else
{
for(ll i=1;i<=b;i++)
ans *= a;
}
return ans;
}
ll dd(char s[],ll x,ll y)
{
char s1[100];
ll m[100]={0};
ll ps1=0,pm=0,i;
int f=0;
if(s[x]=='-'){
f=1;
x++;
}
for(i = x;i < y;i++){
if(s[i]>='0' && s[i]<='9'){
m[pm] += s[i]-'0';
if(pm==0 && f==1){
m[pm]= -m[pm];
f=0;
}
if(s[i+1]>='0' && s[i+1]<='9')
m[pm] *= 10;
else
pm++;
}
else
{
if(s[i]!='(' && s[i]!=')')
while(judge[fun(s[i])][fun(s1[ps1-1])]>=0 && ps1-1>=0)
{
pm--;
m[pm-1]=fun1(m[pm-1],m[pm],s1[ps1-1]);
ps1--;
m[pm]=0;
}
}
if(s[i]<'0' || s[i]>'9'){
if(s[i]=='('){
ll j;
int z=1;
for(j=i+1;j<y;j++){
if(s[j]=='(')
z++;
else if(s[j]==')')
z--;
if(z==0) break;
}
if(z>=1){
continue;
}
else if(j>i+1 && j!=y) {
m[pm++]=dd(s,i+1,j);
if(pm==1 && f==1){
m[pm-1]=-m[pm-1];
f=0;
}
}
if(j==y) i++;
else i=j;
}
else if(s[i]!=')')
{
s1[ps1++]=s[i];
}
}
if(i==y-1){
for(ll t=ps1-1;t>=0;t--)
m[t] = fun1(m[t],m[t+1],s1[t]);
}
}
return m[0];
}
int main()
{
char s[100];
cin >> s;
ll len = strlen(s);
cout << dd(s,0,len) <<endl;
return 0;
}