NYOJ 35 表达式求值(逆波兰式求值)
http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4
NYOJ 35 表达式求值(逆波兰式求值)
逆波兰式式也称后缀表达式。
一般的表达式求值式子都为中缀表达式,而后缀表达式求值相对更容易,所以可以将中缀表达式转换为后缀表达式。
ps:不了解中缀表达式,后缀表达式的建议先去了解一下。
对于初学者容易弄混这三种,其实前,中,后即节点位置。
前缀表达式树,遍历顺序(节点,左,右)。
中缀表达式树,遍历顺序(左,节点,右)。
后缀表达式树,遍历顺序(左,右,节点)。
步骤:
第一步:将中缀表达式转换为后缀表达式。
1,将+,-,*,/,(等要用到的运算进行优先级处理。
2,需要用到一个符号栈处理:
a,数字字符,小数点直接存入另一个字符串S。
b,’(‘直接入栈,当表达式str字符中‘)’出现,将所有栈顶运算符转移至S直至遇到‘(’,‘(’出栈。
c,当表达式str字符中的运算符优先级大于等于(注意一定要大于等于)栈顶运算符优先级时,将字符依次存入S,直至小于为止。当前运算符入栈。
d,最后当str访问完,将栈中剩余运算符存到S。
第二步:将转换后的后缀表达式进行求值。
1,需要一个浮点型栈(具体根据题目要求)存放数值。
2,遍历S遇见操作数,小数点时处理后入栈,直至遇见运算符,出栈两个操作数,处理后将结果再入栈。
3,栈顶元素即为表达式解。
主要注意:
1.小数点的处理。
2,细心。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int maxn=+; string s1,s2;
stack<char> s;
stack<double> c; void init()
{
while(!s.empty())
s.pop();
while(!c.empty())
c.pop();
} int pro(char ch)
{
switch(ch)
{
case '+':
case '-':return ;
case '*':
case '/':return ;
default :return ;
}
} void deal()
{
init();
int i=,len=s1.length();
s.push('#');
while(i<len-)
{
if(s1[i]=='(')
s.push(s1[i++]);
else if(s1[i]==')')
{
while(s.top()!='(')
{
s2+=s.top();
s2+=' ';
s.pop();
}
s.pop();
i++;
}
else if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/')
{
while(pro(s.top())>=pro(s1[i]))
{
s2+=s.top();
s2+=' ';
s.pop();
}
s.push(s1[i]);
i++;
}
else
{
while(s1[i]<=''&&s1[i]>=''||s1[i]=='.')
s2+=s1[i++];
s2+=' ';
}
}
while(s.top()!='#')
{
s2+=s.top();
s.pop();
s2+=' ';
}
} double countt()
{ int len=s2.length(),i=;
double y,x;
while(i<len)
{
if(s2[i]==' ')
i++;
else
{
switch(s2[i])
{
case '+':x=c.top();c.pop();x+=c.top();c.pop();i++;break;
case '-':x=c.top();c.pop();x=c.top()-x;c.pop();i++;break;
case '*':x=c.top();c.pop();x*=c.top();c.pop();i++;break;
case '/':x=c.top();c.pop();x=c.top()/x;c.pop();i++;break;
default :
{
x=0.0;
while(s2[i]<=''&&s2[i]>='')
x=x*+(s2[i++]-'');
if(s2[i]=='.')
{
i++;
double k=10.0;y=0.0;
while(s2[i]<=''&&s2[i]>='')
{
y+=(s2[i++]-'')/k;
k*=;
}
x+=y;
}
}
}
c.push(x);
}
}
return c.top();
} int main()
{
int t;
cin>>t;
while(t--)
{
cin>>s1;
s2="";
deal();
printf("%.2lf\n",countt());
}
return ;
}
参考大神博客后,AC了的总结。
不喜勿喷,欢迎赐教,欢迎一起交流
NYOJ 35 表达式求值(逆波兰式求值)的更多相关文章
- NYOJ 35 表达式求值
一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
- python 逆波兰式
逆波兰式,也叫后缀表达式 技巧:为简化代码,引入一个不存在的运算符#,优先级最低.置于堆栈底部 class Stack(object): '''堆栈''' def __init__(self): se ...
- HDU1237 简单的计算器 【堆】+【逆波兰式】
简单的计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- HDU1237 简单计算器 【栈】+【逆波兰式】
简单计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析
Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...
- [LeetCode]Evaluate Reverse Polish Notation(逆波兰式的计算)
原题链接:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 题目描述: Evaluate the value of a ...
- c# 逆波兰式实现计算器
语文不好,不太会组织语言,希望不要太在意. 如题,先简要介绍一下什么是逆波兰式 通常我们在写数学公式的时候 就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀 ...
- Haskell解决逆波兰式
摘自<Haskell趣学指南- Learn You a Haskell for Great Good> {- 逆波兰式(revese polish notation, RPN): 操作符出 ...
随机推荐
- 常用模块 - datetime模块
一.简介 datetime是Python处理日期和时间的标准库. 1.datetime模块中常用的类: 类名 功能说明 date 日期对象,常用的属性有year, month, day time 时间 ...
- mysql中用HEX和UNHEX函数处理二进制数据的导入导出
读取数据并拼写sql语句,然后进行导入.具体方法为: (1)导出时采用HEX函数读取数据,把二进制的数据转为16进制的字符串: select HEX(binField) from testTable; ...
- linux系统中用户
一.用户身份介绍: 1.系统管理员用户,UID(User IDentification) :0, 2.系统用户,UID为1~999,默认的程序都有独立的系统用户负责,运行,进而控制被破坏的范围, 3. ...
- day 17 成员
1.成员 在类中你能写的所有内容都是类的成员 2.变量 1. 实例变量:昨天写的就是实力变量,由对象去访问的变量 2. 类变量: 这个变量属于类.但是对象也可以访问 ...
- 【一】调通单机版的thrift-python版本
开发步骤说明 [任务1]调通单机版的thrift-python版本 [任务1]调通单机版的thrift-python版本 安装thrift 创建thrift模块文件并编译 开发python版的clie ...
- STM32(10)——窗口看门狗
简介: 窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障.除非递减计数器的值在 T6 位 (WWDG->CR 的第六位)变成 0 ...
- elasticsearch按范围聚合
范围聚合适用于对数据按照指定范围进行分类聚合的应用场景,from和to表示范围起始值的半开半闭区间(包含from值不包含to值),key表示别名 如 {:key=>"2h", ...
- ecshop跨站漏洞详情及修补网站漏洞
ecshop目前最新版本为4.0,是国内开源的一套商城系统,很多外贸公司,以及电商平台都在使用,正因为使用的人数较多,很多攻击者都在挖掘该网站的漏洞,就在最近ecshop被爆出高危漏洞,该漏洞利用跨站 ...
- RDO与RLO
RDO: 平均误差(SSD/SSE).均方误差(MSE).绝对误差和(SAD).峰值信噪比(PSNR) min D subject to R < Rc 拉格朗日优化(λ为拉格朗日乘子): min ...
- 深入理解@RequestBody注解
我写文章历来追求通俗易懂,今天来深入探讨一下@RequestBody注解.提起这个,所有做过mvc开发的同学应该都不陌生,使用上面肯定也是信手拈来. 所以我这里就简单的提一下这个注解的使用: 1.当客 ...