表达式的值

 http://icpc.upc.edu.cn/problem.php?cid=1680&pid=3

#include
#include
#include
#define p 10007
using namespace std;
stacks;
int n,i,f[100005],v[100005],t,k;
char c[100005],a[200005];
int main()
{
    scanf("%d",&n);
    getchar();
    for(i=1; i<=n; i++)
        scanf("%c",&c[i]);
    a[++k]='.';
    for(i=1; i<=n; i++)
    {
        if(c[i]=='('||c[i]=='*')
            s.push(c[i]);
        if(c[i]=='+')
        {
            while(s.size()&&s.top()=='*')
            {
                a[++k]=s.top();
                s.pop();
            }
            s.push(c[i]);
        }
        if(c[i]==')')
        {
            while(s.size()&&s.top()!='(')
            {
                a[++k]=s.top();
                s.pop();
            }
            s.pop();
        }
        if(c[i]!='('&&c[i]!=')')
            a[++k]='.';
    }
    while(s.size())
    {
        a[++k]=s.top();
        s.pop();
    }
    for(i=1; i<=k; i++)
    {
        if(a[i]=='.')
        {
            f[++t]=1;
            v[t]=1;
        }
        if(a[i]=='*')
        {
            t--;
            f[t]=(f[t+1]*v[t]+f[t]*v[t+1]+f[t]*f[t+1])%p;
            v[t]=v[t]*v[t+1]%p;
        }
        if(a[i]=='+')

        {
            t--;
            v[t]=(f[t+1]*v[t]+f[t]*v[t+1]+v[t]*v[t+1])%p;
            f[t]=f[t]*f[t+1]%p;
        }
    }
    printf("%d\n",f[1]);
}

 

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