nyoj128 前缀式求值

http://acm.nyist.net/JudgeOnline/problem.php?pid=128


前缀式求值 类似后缀式求值 

从后向前进行运算

从后向前运算

遇到数字就压入栈中,遇到运算符号就提取栈顶的两个元素进行运算,结果保留到栈中

#include<bits/stdc++.h>
using namespace std;
double nu[2000];
char c[10000],s[10000];
int main()
{
    while(gets(s)!=NULL)
    {
        int top=0;
        int len=strlen(s);
        int flag=0,tail;
        memset(nu,0,sizeof(nu));
        for(int i=len-1;i>=0;)
        {
            if(s[i]>='0'&&s[i]<='9')            //遇到数字就压人栈中
            {
                while(s[i]!=' ')                         
                {
                    i--;
                }
                tail=i;                                     //获得位置 <span id="transmark"></span>
                i++;
                double a=s[i]-'0';                      //提取数字并转化
                i++;
                if(s[i]=='.'&&i<len)
                {
                    i++;
                    double bits=0.1;
                    while(s[i]>='0'&&s[i]<='9')
                    {
                        a+=bits*(s[i]-'0');
                        bits*=0.1;
                        i++;
                    }
                }
                nu[++top]=a;
                i=tail-1;
            }
           if(s[i]==' ')
            i--;
            if(top>1&&(s[i]<'0'||s[i]>'9'))
            {
                switch(s[i])
                {
                    case '+':nu[top-1]=nu[top]+nu[top-1];break;
                    case '-':nu[top-1]=nu[top]-nu[top-1];break;
                    case '/':nu[top-1]=nu[top]/nu[top-1];break;
                    case '*':nu[top-1]=nu[top]*nu[top-1];break;
                }
                top--;
              //  cout<<nu[top]<<endl;
                i--;
                if(s[i]==' ')
                    i--;
            }
        }
        printf("%.2lf\n",nu[top]);
    }
    return 0;
}


你可能感兴趣的:(nyoj128 前缀式求值)