NYOJ128 前缀式计算(栈的运用)

2015-01-24 05:39:01 · 作者: · 浏览: 3

?

+ 2 * + 3 4 5的值就是 37,详见输入输出。

输入有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。输出对每组数据,输出该前缀表达式的值。输出结果保留两位小数。样例输入
+ 2 * + 3 4 5
+ 5.1 / 3 7
样例输出
37.00
5.53

题目分析:

用两个栈进行存下数字和操作,进行计算,我刚开始想的是,每当连续输入两个数就行进行计算,并将结果压入数字栈中,并且操作时,应该保证后出栈的数字在前,先出栈的在后,这样可以保证-、/的结果。。。。。哎,不知道为什么一直Wa,最后看看别人打代码,这题可以从后往前计算,遇到操作符进行计算即可。此题需要注意就是字符串到数字的转换。

?

AC代码:

?

#include
    
     
#include
     
       #include
       #include
       
         #include
        
          #include
         
           #include
          
            #include
           
             #include
            
              #include
             
               #include
              
                #include
               
                 #include
                
                  using namespace std; char str[1005]; stack
                 
                   dt; int start; void vol(){ int i=0,k=0; char a[15],b[15]; for(;str[start]!=' ';start--){ a[k++]=str[start]; } start--;//去掉数字后面的空格 a[k]=''; //strrev();此函数不能用 for(i=0;i
                  
                    我的代码:
                   

?

?

int main()
{
    string str;
    int i,k;
    double a,b;
    while(getline(cin,str)){
        stack
                    
                      dt;
        stack
                     
                       ct; i=-1; k=0; while(i!=str.size()){ ++i; if(str[i] == ' ') ++i; if(str[i] >= '0' && str[i] <= '9'){ string res; double temp; while(i != str.size() && str[i] != ' ') res += str[i++]; sscanf(res.c_str(), %lf, &temp); //cout<
                      
                       1){ a=dt.top(); dt.pop(); b=dt.top(); dt.pop(); char c=ct.top(); ct.pop(); if(c=='+') dt.push(b+a); if(c=='-') dt.push(b-a); if(c=='*') dt.push(b*a); if(c=='/') dt.push(b/a); k=1; } } while(dt.size()>1&&ct.size()){//计算最后一个 a=dt.top(); dt.pop(); b=dt.top(); dt.pop(); char c=ct.top(); ct.pop(); if(c=='+') dt.push(b+a); if(c=='-') dt.push(b-a); if(c=='*') dt.push(b*a); if(c=='/') dt.push(b/a); } int k=1; if(ct.size()&&ct.top()=='-') k=-1; printf(%.2lf ,k*dt.top()); } return 0; } 
                      
                     
                    


?