题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool zifu(char c)				//判断是否为字符
{
    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')
    {
        return true;
    }
    return false;
}

char youxianji(char a,char b)		//判断优先级
{
    if(a=='(')
    {
        if(b==')')
        {
            return '=';
        }
        return '<';
    }
    else if(a=='+'||a=='-')
    {
        if(b=='*'||b=='/'||b=='(')
        {
            return '<';
        }
        return '>';
    }
    else 
    {
        if(b=='(')
        {
            return '<';
        }
        return '>';
    }
}

int jieguo(int x,int y,char z)		//计算结果
{
    if(z=='+')
    {
        return y+x;
    }
    else if(z=='-')
    {
        return y-x;
    }
    else if(z=='*')
    {
        return y*x;
    }
    else 
    {
        return y/x;
    }
}

bool fuhao(char z)			//判断是否为负号
{
    if (z == '+' || z == '-' || z == '*' || z == '/' || z == '(')
    {
        return true;
    }
    return false;
}

int main() 
{
    char s[100];
    scanf("%s",s);
    int a[100]={0};
    char b[100]={0},c;
    int i=0,x,y,t1=-1,t2=-1;
    while(s[i]||t2>-1)
    {
        if(zifu(s[i]))
        {
		  		//如果i==0时s[i]=='-',或者s[i]=='-'时s[i-1]为‘+’ ‘-’ ‘*’ ‘/’ ‘(’ 中任意一个符号时,s[i]就是负号
            if(s[i]=='-'&&(fuhao(s[i-1])||i==0))
            {
                i++;
                int sum=0;
                while(s[i]&&s[i]>='0'&&s[i]<='9')
                {
                    sum=sum*10+s[i]-'0';
                    i++;
                }
                a[++t1]=-sum;
            }
            else if(t2==-1)
            {
                b[++t2]=s[i++];
            }
            else 
            {
                char k=youxianji(b[t2],s[i]);
                switch(k)
                {
                    case '>':
                    x=a[t1--];
                    y=a[t1--];
                    c=b[t2--];
                    a[++t1]=jieguo(x,y,c);
                    break;
                    case '=':
                    t2--;
                    i++;
                    break;
                    case '<':
                    b[++t2]=s[i++];
                    break;
                }
            }
        }
        else if(s[i]&&s[i]>='0'&&s[i]<='9')
        {
            int sum=0;
            while(s[i]&&s[i]>='0'&&s[i]<='9')
            {
                sum=sum*10+s[i]-'0';
                i++;
            }
            a[++t1]=sum;
        }
        if(s[i]==0)
        {
            while(t2>-1)
            {
                x=a[t1--];
                y=a[t1--];
                c=b[t2--];
                a[++t1]=jieguo(x,y,c);
            }
        }
    }
    printf("%d\n",a[t1]);
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务