表达式求值(不带()类型的基本的+,-,*,/,^)

题目描述
给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值 在这里," /" 为整除 最终结果为正整数,数据保证不需要使用高精度!

输入
仅一行,即为表达式

输出
仅一行,既为表达式算出的结果 结果小于maxlongint,且整个计算的过程中,也不会超过maxlongint

样例输入
2^3+1

样例输出
9

提示
表达式总长度< =20

解题思路:
1,将数字和符号分别存放于数组中;
2,每次输入符号时,将前面所有小于或等于当前符号优先级的数据进行处理;
3,当最后一个数字输入时,从后往前对还存在的所有数据进行处理.

#include
#include
int fun(int a,int b,char c);                    //进行运算
int fun1(char ch);                              //各个符号所对应的值,与表格相对应
int main()
{
    int Judge[5][5] = {{0,0,-1,-1,-1},          //构建符号间优先关系表格
                       {0,0,-1,-1,-1},			//从上往下,从左到右依次对应+,-,*,/,^
                       {1,1,0,0,-1},			//1代表高于,0表示同级,-1表示低于
                       {1,1,0,0,-1},
                       {1,1,1,1,0}};
    char str[20],type[20];                      //str表示输入,type储存符号
    int num[20] = {0};                          //num用于储存数字,且初始化为0,方便多位数的储存
    int i,j = 0 , k = 0,len,t;                  //j表示数字个数,k表示符号个数
    int sum;                                    //sum表示计算得出的结果
    scanf("%s",str);
    len = strlen(str);
    for(i = 0 ; i < len ; i++)
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            num[j] += str[i] - '0';             //防止出现多位数字的情况,例:11+11,将11储存在一个数组元素中
            if(str[i+1]>='0'&&str[i+1]<='9')  num[j] *= 10;
            else j++;
        }
        else
        {
            while(Judge[fun1(str[i])][fun1(type[k-1])] <= 0&&k-1>=0)    //将前面所有小于或等于当前符号优先级的进行处理
            {
                k--;                                                    //符号出栈一位进行处理
                sum = fun(num[j-2],num[j-1],type[k]);                   //将数据进行处理
                j = j-2;                                                //数字出栈两位
                num[j++] = sum;                                         //将运算的结果接着储存
                num[j] = 0;                                             //一定要赋0,不然会对后面的数字储存造成影响
            }
        }
        if(str[i]<'0'||str[i]>'9')  type[k++] = str[i];
        if(i == len-1)
        {
            for(t = k-1 ; t >= 0 ; t--)                                 //从后往前进行数据处理,因为后面符号的优先级可能会比前面的高
            {
                sum = fun(num[t],num[t+1],type[t]);
                num[t] = sum;
            }

        }
    }
    printf("%d\n",sum);
    return 0;
}

int fun(int a,int b,char c)
{
    int i,sum;
    if(c=='+')  sum = a+b;
    else if(c=='-') sum = a-b;
    else if(c=='*') sum = a*b;
    else if(c=='/') sum = a/b;
    else if(c=='^')
    {
        sum = 1;
        for(i = 0 ; i < b ; i++)                                    //本来想用pow函数的,结果发现存在精度问题.比如:10^2==99
        {
            sum *= a;
        }
    }
    return sum;
}

int fun1(char ch)
{
    if(ch=='+')  return 0;
    else if(ch=='-') return 1;
    else if(ch=='*') return 2;
    else if(ch=='/') return 3;
    else if(ch=='^') return 4;
    return 0;

}

你可能感兴趣的:(数据结构栈)