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 表达式求值(逆波兰式求值)的更多相关文章

  1. NYOJ 35 表达式求值

    一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...

  2. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  3. python 逆波兰式

    逆波兰式,也叫后缀表达式 技巧:为简化代码,引入一个不存在的运算符#,优先级最低.置于堆栈底部 class Stack(object): '''堆栈''' def __init__(self): se ...

  4. HDU1237 简单的计算器 【堆】+【逆波兰式】

    简单的计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. HDU1237 简单计算器 【栈】+【逆波兰式】

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  6. Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析

    Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...

  7. [LeetCode]Evaluate Reverse Polish Notation(逆波兰式的计算)

    原题链接:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 题目描述: Evaluate the value of a ...

  8. c# 逆波兰式实现计算器

    语文不好,不太会组织语言,希望不要太在意. 如题,先简要介绍一下什么是逆波兰式  通常我们在写数学公式的时候  就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀 ...

  9. Haskell解决逆波兰式

    摘自<Haskell趣学指南- Learn You a Haskell for Great Good> {- 逆波兰式(revese polish notation, RPN): 操作符出 ...

随机推荐

  1. js之广告

    涉及到offset等有关获取各种尺寸问题下 <!doctype html> <html lang="en"> <head> <meta c ...

  2. 坑爹的jquery ui datepicker

    1.坑爹的jquery ui datepicker 竟然不支持选取时分秒,害的我Format半天 期间尝试了bootstrap的ditepicker,但是不起作用,发现被jquery ui 覆盖了, ...

  3. SQL Server 2012 - 动态SQL查询

    动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...

  4. 将图片绘制到画布上:imagecopy()

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  5. day 16 初试面试对象

    1.初识面向对象      面向过程:             一切以事物的发展流程为中心      面向对象:             一切以对象为中心.一切皆为对象.具体的某一个事务就是对象 打比 ...

  6. 大数据&人工智能&云计算

    仅从技术上讲大数据.人工智能都包含工程.算法两方面内容: 一.大数据: 工程: 1)云计算,核心是怎么管理大量的计算机.存储.网络. 2)核心是如何管理数据:代表是分布式存储,HDFS 3)核心是如何 ...

  7. C语言,初次见面~

    C语言是一门介于低级语言(如汇编语言)和高级语言(如Java,Python)之间的一门编程语言,所以它兼有两类语言的一些优点,并且具有自身的一些特点. 1.c语言的高效性.c语言具有通常是汇编语言才具 ...

  8. 厦门Uber优步司机奖励政策(1月4日~1月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. JavaWeb(二)——Tomcat服务器(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  10. 容器云技术:容器化微服务,Istio占C位出道

    在精彩的软件容器世界中,当新项目涌现并解决你认为早已解决的问题时,这感觉就像地面在你的脚下不断地移动.在许多情况下,这些问题很久以前被解决,但现在的云原生架构正在推动着更大规模的应用程序部署,这就需要 ...