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. Mac连接Linux服务器

    1.终端命令 a).打开Mac的命令终端 b).输入ssh -p 22 root@101.200.86.233 它会提示你输入密码,输入正确的密码之后,你就发现已经登陆成功了.(22: 端口号 roo ...

  2. 设计四个线程,其中两个线程每次对j增加1,另外两个线程对j每次减1,写出程序

    /* * 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.写出程序. */ public class ThreadTest { private int j; public sta ...

  3. 关于Quartz 2D绘图的简单使用

    Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境,Quartz 2D的API可以实现许多功能,如:基于路径的绘图.透明度.阴影.颜色管理.反锯齿.PDF文档生成和PDF元 ...

  4. Flask之蓝图的使用

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...

  5. Linux服务器安全检测维护基础汇总/持续更新

    登陆系统查询可以用户 w命令可以显示在线用户,passwd -l xxx可以锁定xxx用户无法登陆,如果此时可以用户在线,使用kill命令踢下线 查看可疑进程 ps -ef命令锁定pid,或者pido ...

  6. Divisibility题解

    From lyh 学长 2018.5.3 信(liang)心(liang)杯T3 一道略弱的数论题. 题目描述 给定 n个数,问是否能从中选出恰好 k个数,使得这些数两两之差可以被 m 整除. 输入输 ...

  7. html5新特性与用法大全了解一下

    有好多小伙伴私聊我问我html5新特性 和用法,下面我给大家具体介绍一下html5都新加了哪些新特性,下面我给大家总结一下. 1)新的语义标签 footer header 等等2)增强型表单 表单2. ...

  8. WPF 为 PasswordBox 控件添加水印,最低级版

    原因也很直接,老板需要,一开始为TextBox发愁,就找了这个控件凑合用,至于版权什么的,内部工具也不卖钱,而且我不懂英文,也就无视了: Extended WPF Toolkit™ Community ...

  9. 杭州优步uber司机第一组奖励政策

    -8月9日更新- 优步杭州第一组: 定义为激活时间在2015/6/8之前的车主(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司 ...

  10. P1535 游荡的奶牛

    P1535 游荡的奶牛 题目描述 Searching for the very best grass, the cows are travelling about the pasture which ...