NYOJ 128

前缀式计算

时间限制: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

//NYOJ HDU均AC
#include <cstdio>
#include <cstring>
#include <stack>
#include <cstdlib>
using namespace std;
char str[3500];
int main()
{
    while(gets(str)!=NULL)
    {
        stack <char> num;
        stack <double> operand;
        while(!operand.empty())
            operand.pop();  

        int len=strlen(str);
        for(int i=len-1; i>=0; i--)
        {
            switch(str[i])
            {
                case ' ':
                if(!num.empty())
                {
                    double number = 0;
                    while(!num.empty() && num.top() != '.')
                    {
                        int t = num.top() - '0';
                        num.pop();
                        number = number * 10 + t;
                    }
                    if(!num.empty())
                    {
                        num.pop();//去掉点号
                        double index = 0.1;
                        while(!num.empty())
                        {
                            int t = num.top() - '0';
                            num.pop();
                            number = number + t * index;
                            index /= 10;
                        }
                    }
                    operand.push(number);
                }
                break;
                case '+':
                    double a, b;
                    a = operand.top(), operand.pop();
                    b = operand.top(), operand.pop();
                    a = a + b;
                    operand.push(a);
                    break;
                case '-':
                    a = operand.top(), operand.pop();
                    b = operand.top(), operand.pop();
                    a = a - b;
                    operand.push(a);
                    break;
                case '*':
                    a = operand.top(), operand.pop();
                    b = operand.top(), operand.pop();
                    a = a * b;
                    operand.push(a);
                    break;
                case '/':
                    a = operand.top(), operand.pop();
                    b = operand.top(), operand.pop();
                    a = a / b;
                    operand.push(a);
                    break;
                default:
                    num.push(str[i]);
            }
        }
        double result = operand.top();
        printf("%.2f\n", result);
        memset(str,0,sizeof(str));
     }
    system("pause");
    return 0;
}

//NYOJ AC,hdu re
#include <cstdio>
#include <cstring>
#include <stack>
#include <cctype>
#include <cmath>
#include <cstdlib>
using namespace std;
char str[3500];
int sign(char c)
{
    switch(c)
    {
        case '+': return 1;
        case '-': return 2;
        case '*': return 3;
        case '/': return 4;
		default : return 0;
    }
}
int main()
{
    int i,j,p,q;
    while(gets(str)!=NULL)
    {
        stack <float> s;
        int len=strlen(str);
        for(i=len-1;i>=0;i--)//或者用scanf从标一输入,不用移位
            str[i+1]=str[i];
        str[0]=' ';
        str[len+1]=' ';
        float temp1,temp2,temp;
		if(len==1)
			s.push((float)(str[1]-'0'));
		else
        for(i=len;i>=1;i--)
        {
            if(isdigit(str[i])&&str[i-1]==' '&&str[i+1]==' ')
                s.push((float)(str[i]-'0'));
            else if(str[i]=='.')
            {
                float e=0.1;
                temp1=temp2=0;
                temp1=(float)(str[i-1]-'0');
                for(q=i+1;str[q]!=' ';q++)
                {
                    temp2+=(str[q]-'0')*e;
                    e/=10;
                }
                temp=temp1+temp2;
                s.push(temp);
            }
            else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
            {
                int flag=sign(str[i]);
                switch(flag)
                {
                    case 1:{temp1=s.top();s.pop();temp2=s.top(),s.pop();temp=temp1+temp2;s.push(temp);break;}
                    case 2:{temp1=s.top();s.pop();temp2=s.top(),s.pop();temp=temp1-temp2;s.push(temp);break;}
                    case 3:{temp1=s.top();s.pop();temp2=s.top(),s.pop();temp=temp1*temp2;s.push(temp);break;}
                    case 4:{temp1=s.top();s.pop();temp2=s.top(),s.pop();temp=temp1/temp2;s.push(temp);break;}
					default : continue;
                }
            }
        }
        printf("%.2f\n",s.top());
        while(!s.empty())
            s.pop();
    }
    return 0;
}

 

 

时间: 2024-10-13 10:58:38

NYOJ 128的相关文章

CSSVault推荐的128个CSS布局站点

css|站点 以下是CSSVault.com推荐的2004年4月--6月128个CSS布局站点,供大家参考: Coudal Partners Alazanto Lookatlao Icon Buffet ECCO I Begin With An Idea Simplebits Wildly Sophisticated Minid Flog Family Standards Mark Wyner Eighty-Watt Cinema Bad Religion Primrun Tom Peters

Dreamweaver MX 2004视频宝典教程(128)

dreamweaver|教程 第 128 集:客户服务.帮助中心页面制作 课程目标:制作"客户服务"."帮助中心"页面 课程要点:使用Dreamweaver制作"客户服务"."帮助中心"页面. [全屏观看] | [下载视频] 本教程尺寸为 800 * 600 建议全屏在线观看或下载观看,以达到最佳观看效果

ORA-01652错误:无法通过128(在表空间TEMP中)扩展temp段

在Oracle数据库中进行order by or group by.索引的创建和重创建.distinct操作.union & intersect & minus sort-merge joins.Analyze 操作.异常等操作时,会产生很多的临时数据.如有一张员工信息表,数据库中是安装记录建立的时间来保存的.如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据.通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区

UVa 128 Software CRC:模计算及CRC循环冗余校验码

128 - Software CRCTime limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=64 You work for a company which uses lots of personal computers. Your boss, Dr Penny Pi

在小波变换中,两矩阵求差算法中,+128是什么意思?

问题描述 在小波变换中,两矩阵求差算法中,+128是什么意思? /********************************************************************** 函数名称: MatrixSub() 参数: unsigned char *matrixA 待求差矩阵A数组指针 unsigned char *matrixB 待求差矩阵B数组指针 int height 高度 int width 宽度 unsigned char *result 差矩阵数组指针

c语言-简单选择排序 时间限制: 40 Sec 内存限制: 128 MB

问题描述 简单选择排序 时间限制: 40 Sec 内存限制: 128 MB 题目描述 编一程序用简单选择排序方法对n个整数排序(从大到小). 对n个数进行降序排列,简单选择排序的算法思想如下: 1)首先通过n-1次比较,从n个元素中找出值最大的元素,将它与第一个元素交换.(第一趟排序). 2)再通过n-2次比较,从剩余的n-1个元素中找出值次大的元素,将它与第二个元素交换.(第二趟排序). 3)重复上述操作,共进行n-1趟排序后,排序结束. 输入 先输入整数个数n(n<=100000) 然后输入

oracle中file 1 block 128 corrupted/坏块恢复—system rollback坏块修复

有个数据库file 1 block 128 坏块导致数据库无法启动报错如下 该数据库版本是11.2.0.1,根据我们的经验该block是system rollback 的segment header,以下为我在正常哭查询结果SQL> select file_id,block_id,blocks from dba_extents where segment_name='SYSTEM'    FILE_ID   BLOCK_ID     BLOCKS---------- ---------- ---

NYOJ 99单词拼接(有向图的欧拉(回)路)

/* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个 有向图的欧拉回路:所有的节点都有In[i]==Out[i] */ #include<iostream> #include<cstring> #include<cstdio> #include<

for语句中那个128是什么意思,和后来的输出有什么关系.还有为什么输出从97开始?

问题描述 for语句中那个128是什么意思,和后来的输出有什么关系.还有为什么输出从97开始? 解决方案 打印的是assic码字符,就是char类型的范围是0-127 解决方案二: c从0开始执行循环,当c>=128时结束循环,128是设定的长度. isLowerCase(c)指找出c中的小写字母,因为0~96不是小写字母,小写字母是从97开始,a转换为int型时值为97,所以输出从97开始. 解决方案三: char是一个字节,有8位,所以取值范围是0~127 而为什么从97开始 是因为这一句c