表达式求值难度3



#include<stdio.h>
#include<string.h>
int main()
{
    int t;
    scanf("%d",&t);//有几组数据
    getchar();
    while(t--)
    {
        int a[300];
        char b[300],s[300];
        int top1=-1,m,top2=-1,i,n=0,flag=1;
        gets(s);//整体存放到一个字符组里面
        m=strlen(s);
        for(i=0;i<m;i++)
        {
            if((s[i]<'0'|| s[i]>'9') && s[i]!=')')
            {//当为字符 时候,就存放到b这个以数组开的 栈 中
                top1++;//栈的栈顶
                b[top1]=s[i];//压栈
            }
            if(s[i]>='0'&& s[i]<='9')
            {
                n=10*n+s[i]-'0';//如果数字是两位以上的,要注意恢复原来数字
                flag=1;//设个标记,如果下面遇到其他字符的话,把数字压栈
            }
            if((s[i]==')'||s[i]==','||i+1==m)&&flag)//遇到","")“时把数字压栈
            {
                top2++;
                a[top2]=n;
                flag=0;
                n=0;//压栈之后,把n初始化
            }
            if(s[i]==')')//遇到右括号,开始计算这个括号里面的表达式
            {
                if(b[top1-2]=='d')
                {
                    n=a[top2]+a[top2-1];
                    top2=top2-1;//计算过加法之后,把数字栈中的两个加数弹出,同时,把和压进去
                    a[top2]=n;//将和压栈
                    n=0;
                    top1=top1-5;//此时,计算过一个括号里面的运算,将字符栈中的5个字符弹出,直至遇到逗号
                }
                else if(b[top1-2]=='n')
                {
                    if(a[top2]>a[top2-1])
                        n=a[top2-1];
                    else
                        n=a[top2];
                    top2--;
                    a[top2]=n;
                
                    n=0;
                    top1=top1-5;
                }
                else if(b[top1-2]=='x')
                {
                    if(a[top2]<a[top2-1])
                        n=a[top2-1];
                    else
                        n=a[top2];
                    top2--;
                    a[top2]=n;
                    n=0;
                    top1=top1-5;
                }
            }
        }
        printf("%d\n",a[top2]);
    }return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值