表達式求值(博客裏還有不同版本的

題目描述
給出一個表達式,其中運算符僅包含+,-,*,/,^要求求出表達式的最終值 數據可能會出現括號情況 還有可能出現多餘括號情況 數據保證不會出現> 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章