前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nyoj-----前缀式计算

nyoj-----前缀式计算

作者头像
Gxjun
发布2018-03-21 13:12:04
5610
发布2018-03-21 13:12:04
举报
文章被收录于专栏:mlml

前缀式计算

时间限制:1000 ms  |           内存限制:65535 KB

难度:3

描述

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

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

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

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

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

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

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

比如:

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

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

代码语言:javascript
复制
+ 2 * + 3 4 5
+ 5.1 / 3 7

样例输出

代码语言:javascript
复制
37.00
5.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,由此得出最终结果。 可以看出,用计算机计算前缀表达式的值是很容易的。

用栈来表示:

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-12-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前缀式计算
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档