前缀式计算 nyoj

时间:2022-12-27 14:41:20

题目描述

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

如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

将中缀表达式转换为前缀表达式

转换步骤如下:

  1. 初始化两个栈:运算符栈s1,储存中间结果的栈s2
  2. 从右至左扫描中缀表达式
  3. 遇到操作数时,将其压入s2
  4. 遇到运算符时,比较其与s1栈顶运算符的优先级
    1. 如果s1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈
    2. 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入s1
    3. 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较
  5. 遇到括号时
    1. 如果是右括号“)”,则直接压入s1
    2. 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃
  6. 重复步骤2至5,直到表达式的最左边
  7. 将s1中剩余的运算符依次弹出并压入s2
  8. 依次弹出s2中的元素并输出,结果即为中缀表达式对应的前缀表达式

计算方法:

将得到的字符串处理为只含有数字和运算符

将处理后的字符串从前到后压如栈S1中

将栈S1中的元素逐个弹出

若弹出元素判断为数字   压入栈S2中

若弹出元素判断为运算符   从栈S2中弹出两个元素   与该运算符进行运算    将运算结果重新压入栈S2中

处理完S1中所有元素后    S2栈顶元素即为计算结果

#include <iostream>
#include <stack>
#include <cstdlib>
#include <iomanip>
using namespace std;

double calculate(char c,double l,double r)
{
switch(c)
{
case '+':
return l+r;
case '-':
return l-r;
case '*':
return l*r;
case '/':
return l/r;
}
return 0;
}

int main()
{
string s;
stack<double> num;
while(getline(cin,s))
{
for(int i=s.length()-1;i>=0;--i)
{
if(s[i]==' ')//因为输入的每个字符有空格隔开,所以要忽略空格
continue;
else if(isdigit(s[i]))//如果是数字
{
while(isdigit(s[i])||s[i]=='.')//这个数字可能是小数或者数字不止一位
--i; //要找到这个数第一个数字的位置
i++; //前面返回的是第一个数的前一个位置
double t_num=atof(&s[i]); //那这个数转成数字压栈
num.push(t_num);
}
else//如果是操作符,就把栈里面靠近栈定的两位元素取出来
{//做运算,然后再把结果压栈
double l=num.top();
num.pop();
double r=num.top();
num.pop();
num.push(calculate(s[i],l,r));
}
}//for
cout<<setiosflags(ios::fixed)<<setprecision(2)<<num.top()<<endl;
num.pop();
}//while
return 0;
}

前缀式计算 nyoj的更多相关文章

  1. NYOJ 128 前缀式计算

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...

  2. NYOJ128前缀式计算

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...

  3. NYOJ128 前缀式计算 【栈】

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上 ...

  4. NYOJ128 前缀式计算&lpar;栈的运用&rpar;

    题目信息: http://acm.nyist.net/JudgeOnline/problem.php? pid=128 + 2 * + 3 4 5的值就是 37,详见输入输出. 输入 有多组測试数据, ...

  5. NYOJ--128--前缀式计算(表达式求值)

    前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...

  6. nyoj-----前缀式计算

    前缀式计算 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀 ...

  7. 搜索广告与广告网络Demand技术-流式计算平台

    流式计算平台-Storm 我们以Storm为例来看流式计算的功能是什么. 下面内容引用自大圆的博客.在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapRed ...

  8. 流式计算与计算抽象化------《Designing Data-Intensive Applications》读书笔记15

    上篇的内容,我们探讨了分布式计算中的MapReduce与批处理.所以本篇我们将继续探索分布式计算优化的相关细节,并且分析MapReduce与批处理的局限性,看看流式计算是否能给我们在分布式计算层面提供 ...

  9. Apache Beam—透视Google统一流式计算的野心

    Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...

随机推荐

  1. 6&sol;20 sprint3 看板和燃尽图的更新

  2. java10-2 toString&lpar;&rpar;方法

    public String toString():返回该对象的字符串表示. Integer类下的一个静态方法: public static String toHexString(int i):把一个整 ...

  3. Hibernate,JPA注解&commat;OneToMany&lowbar;Set

    用例代码如下: 数据库DDL语句 1,CAT表 create table CAT ( id CHAR) not null, create_time ), update_time ), cat_name ...

  4. Tuning 简介

    典型的不好的设计: 破坏了系统的可扩展性(韧性) Applications requiring significant concurrency management as user populatio ...

  5. encodeURIComponent编码后java后台的解码 (AJAX中文解决方案)

    encodeURIComponent编码后java后台的解码 (AJAX中文解决方案) 同学的毕业设计出现JavaScript用encodeURIComponentt编码后无法再后台解码的问题. 原来 ...

  6. Table of Contents - CXF

    Getting Started A simple JAX-WS service Writing a service with Spring Tools WSDL to Java RESTful Ser ...

  7. 如何使用Flexbox和CSS Grid,实现高效布局

    CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来 ...

  8. Android查缺补漏(线程篇)-- IntentService的源码浅析

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8975114.html 在Android中有两个比较容易弄混的概念,Servic ...

  9. 第50章 设备授权端点&lpar;Device Authorization Endpoint&rpar; - Identity Server 4 中文文档&lpar;v1&period;0&period;0&rpar;

    设备授权端点可用于请求设备和用户代码.此端点用于启动设备流授权过程. 注意 终端会话端点的URL可通过发现端点获得. client_id 客户标识符(必填) client_secret 客户端密钥可以 ...

  10. 【deep learning学习笔记】注释yusugomori的DA代码 --- dA&period;cpp --模型准备

    辅助函数和构造函数. #include <iostream> #include <math.h> #include "dA.h" using namespa ...