zoukankan      html  css  js  c++  java
  • nyoj-----前缀式计算

    前缀式计算

    时间限制: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为输入结束的标志。
    输出
    对每组数据,输出该前缀表达式的值。输出结果保留两位小数。
    样例输入
    + 2 * + 3 4 5
    + 5.1 / 3 7
    样例输出
    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,由此得出最终结果。
    可以看出,用计算机计算前缀表达式的值是很容易的。

    用栈来表示:

    #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,'',sizeof(bb));
                     memset(tt,'',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,'',sizeof(bb));
                     memset(tt,'',sizeof(tt));
                   }
            }
            cc=ans.top();
            ans.pop();
            printf("%.2lf
    ",cc);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Create方法失效而没有提示错误信息
    JS弹出窗口控制
    本周活动
    JavaScript的初步了解
    关于PHP接收文件的资料
    mvc模式改进网站结构
    一周动态
    排序
    Java的内存泄漏
    Android笔记
  • 原文地址:https://www.cnblogs.com/gongxijun/p/3463205.html
Copyright © 2011-2022 走看看