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

題目描述
給出一個表達式,其中運算符僅包含+,-,*,/,^要求求出表達式的最終值 在這裏," /" 爲整除 最終結果爲正整數,數據保證不需要使用高精度!

輸入
僅一行,即爲表達式

輸出
僅一行,既爲表達式算出的結果 結果小於maxlongint,且整個計算的過程中,也不會超過maxlongint

樣例輸入
2^3+1

樣例輸出
9

提示
表達式總長度< =20

思路:對於每個計算符給一個數值相匹配,在給一個二維數組,對於前面給的值,比較他們的優先級,比如‘-’是1,‘’是2那麼judge[1][2]= 1,表示‘’比‘-’優先級高,先處理優先級高的

#include<bits/stdc++.h>
using namespace std;
 
 
int 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;
}
 
int fun1(int a,int b,char c)
{
    int num;
    if(c=='+')  num=a+b;
    else if(c=='-') num=a-b;
    else if(c=='*') num=a*b;
    else if(c=='/') num=a/b;
    else{
        num=1;
        for(int i=1;i<=b;i++)
            num *= a;
    }
    return num;
}
 
 
int 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}};
 
int main()
{
    char s[20],s1[20];
    int m[20]={0};
    int ps1=0,pm=0,i,len;
    int sum;
    cin >> s;
    len = strlen(s);
    for(i=0;i<len;i++){
        if(s[i]>='0'&&s[i]<='9'){
            m[pm] += s[i]-'0';
            if(s[i+1]>='0' && s[i+1]<='9')  m[pm] *= 10;
            else pm++;
        }
        else
        {
            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') s1[ps1++]=s[i];
        if(i==len-1){
            for(int t=ps1-1;t>=0;t--)
            {
                sum = fun1(m[t],m[t+1],s1[t]);
                m[t] = sum;
            }
        }
    }
    cout << sum << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章