nyoj 305 表达式求值

点击打开链接


思路: //通过两个栈进行模拟
遇到运算符 将其存到运算符栈中遇到 数字将其存到数字栈中 ,
遇到 ) 分别从两个栈中提取元素进行运算


#include<bits/stdc++.h>  //通过两个栈进行模拟
using namespace std;
char s[10000];
int a[10000];
int op[10];  //0 max; 1 min ; 2 add
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        while(n--)
        {
            scanf("%s",s);
            int len=strlen(s);
            int top=0,tail=0;
            
            for(int i=0; i<len;)
            {
                if(s[i]>='0'&&s[i]<='9')     //将数字存入栈(数字栈)
                {
                    int sum=0;
                    while(s[i]>='0'&&s[i]<='9')
                    {
                        sum*=10;
                        sum+=s[i]-'0';
                        i++;
                    }
                    a[++top]=sum;
                }
                else
                {
                    if(s[i]==','||s[i]=='(')
                        i++;
                   else if(s[i]==')')  //遇到)进行运算  (提取 数字栈中 的两个数字进行运算 将结果保存在栈顶)
                    {
                        i++;
                        if(op[tail]==0)
                            a[top-1]=min(a[top-1],a[top]);
                        if(op[tail]==1)
                            a[top-1]=max(a[top-1],a[top]);
                        if(op[tail]==2)
                            a[top-1]=(a[top-1]+a[top]);
                        top--;
                        tail--;
                    }
                    else   //将运算符存入栈(运算符栈)
                    {
                        if(s[i]=='m'&&s[i+1]=='i')
                            op[++tail]=0;
                        else if(s[i]=='m'&&s[i+1]=='a')
                            op[++tail]=1;
                        else
                            op[++tail]=2;
                        i+=3;
                    }
                }
            }
            printf("%d\n",a[top]);
        }
    }
    return 0;
}



你可能感兴趣的:(nyoj 305 表达式求值)