nyoj-----前缀式计算

来源:互联网 发布:一个程序员的奋斗史41 编辑:程序博客网 时间:2024/04/30 09:16
描述

先说明一下什么是中缀式:

如2+(3+4)*5这种我们最常见的式子就是中缀式。

而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))

然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )

把括号去掉就是:+ 2 * + 3 4 5

最后这个式子就是该表达式的前缀表示。

给你一个前缀表达式,请你计算出该前缀式的值。

比如:

+ 2 * + 3 4 5的值就是 37

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

从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
例如前缀表达式“- × + 3 4 5 6”:
(1) 从右至左扫描,将6、5、4、3压入堆栈;
(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
(3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
(4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

可以看出,用计算机计算前缀表达式的值是很容易的。

http://www.cnblogs.com/gongxijun/archive/2013/12/07/3463205.html

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<stack>using namespace std;char aa[3005];int main(){    stack<double>ans;    char bb[30],*pre,tt[30];    double cc,dd;    int j;    while(gets(aa)!=NULL)    {        j=0;        for(int i=strlen(aa)-1;i>=0;i--)   /*前缀表达式,从右望左数*/        {            if(aa[i]==' ')            {               if(bb[0]<='9'&&bb[0]>='0')               {                 for(int k=j-1;k>=0;k--)  /*将字符串取反*/                      tt[j-1-k]=bb[k];                 j=0;                 ans.push(strtod(tt,&pre));                 memset(bb,'\0',sizeof(bb));                 memset(tt,'\0',sizeof(tt));               }            }            else             {                if(aa[i]<='9'&&aa[i]>='0'||aa[i]=='.')                     bb[j++]=aa[i];                else                 {                   cc=ans.top();                   ans.pop();                   dd=ans.top();                   ans.pop();                   switch(aa[i])                   {                    case '+': ans.push(cc+dd);break;                    case '-': ans.push(cc-dd);break;                    case '/': ans.push(cc/dd);break;                    case '*': ans.push(cc*dd);break;                   }                }            }        }        if(ans.empty())        {              if(bb[0]<='9'&&bb[0]>='0')               {                 for(int k=j-1;k>=0;k--)  /*将字符串取反*/                      tt[j-1-k]=bb[k];                 j=0;                 ans.push(strtod(tt,&pre));                 memset(bb,'\0',sizeof(bb));                 memset(tt,'\0',sizeof(tt));               }        }        cc=ans.top();        ans.pop();        printf("%.2lf\n",cc);    }    return 0;}


0 0
原创粉丝点击