35-表达式求值

内存限制:64MB 时间限制:3000ms Special Judge: No
accepted:19 submit:26

题目描述:

ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)

输入描述:

第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0

输出描述:

每组都输出该组运算式的运算结果,输出结果保留两位小数。

样例输入:

复制

2
1.000+2/4=
((1+2)*5+1)/4=

样例输出:

1.50
4.00

逆波兰式(也就是中缀表达式转后缀表达式)

法则:

1)如果遇到数字,我们就直接将其输出。

2)如果遇到非数字时,若栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。

3)如果遇到一个右括号,持续出栈并输出符号,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈

4)如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,则持续出栈,直到栈顶元素优先级小于该运算符。最后将该元素入栈

5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

在此,我们将上述做稍加更改,定一个操作数栈和操作符栈,从左至右扫描中缀表达式,若遇见字符,进入操作数栈,如果遇到非数字时,若操作符栈为空或者该符号为左括号或者栈顶元素为括号,直接入栈。

如果遇到一个右括号,出栈并弹出符号,计算操作数栈的定元素的两个,直到栈顶元素为左括号,然后将左括号出栈(注意,左括号只出栈,不输出),右括号不入栈,如果遇到运算符号且栈非空,查看栈顶元素,如果栈顶元素的运算优先级大于或者等于该运算符号,弹出操作符栈顶元素,并弹出操作数栈顶的两个元素,计算结果入栈,然后高优先级的操作符入栈

#include <iostream>
#include <iomanip>
#include <stack>
#include <cstdlib>
using namespace std;
//设置每种操作符的优先权
int priority(char c)
{
if(c=='=')//读取到'='结束
return 0;
if(c=='+'||c=='-')
return 1;
if(c=='*'||c=='/')
return 2;
return 0;
}

void calculate(stack<double>& num,stack<char>& op)//形参设置为引用,所以不用声明为全局变量
{
double r=num.top();//取栈顶元素,先进后出的原则,栈顶的数位操作符右边得数
num.pop();//弹出栈顶元素
double l=num.top();//操作符左边的数
num.pop();
switch(op.top())
{
case '+':
num.push(l+r);
break;
case '-':
num.push(l-r);
break;
case '*':
num.push(l*r);
break;
case '/':
num.push(l/r);
break;
}
op.pop();//运算完之后弹出此操作符
}

int main()
{
int n;
cin>>n;
while(n--)
{
string s;
stack<char> op;//存放操作符的栈
stack<double> num;//存放操作数的栈
cin>>s;
for(int i=0;i<s.length();++i)
{
if(isdigit(s[i]))
{
double t_num=atof(&s[i]);//至于怎么转换的参考链接 http://www.cnblogs.com/tianzeng/p/9038660.html
//cout<<"------->"<<t_num<<endl;
while(i<s.length()&&(isdigit(s[i])||s[i]=='.'))//有可能是小数,此步是把小数存
i++; //后跳过小数
i--;
num.push(t_num);
}
else
{
if(s[i]=='(')
op.push(s[i]);
else if(s[i]==')')
{
while(op.top()!='(')
calculate(num,op);
op.pop();
}
else if(op.empty()||priority(s[i])>priority(op.top()))
op.push(s[i]);
else
{
while(!op.empty()&&priority(s[i])<=priority(op.top()))
calculate(num,op);
op.push(s[i]);
}
}
}
op.pop();
cout<<setiosflags(ios::fixed)<<setprecision(2)<<num.top()<<endl;//精度表达式,
num.pop(); //输出两位小数
}
return 0;
}

nyoj 表达式求值的更多相关文章

  1. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  2. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  3. 数据结构--栈的应用(表达式求值 nyoj 35)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...

  4. nyoj 305 表达式求值 (递归)

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  5. 表达式求值(noip2015等价表达式)

    题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...

  6. 用Python3实现表达式求值

    一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...

  7. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  8. nyoj305_表达式求值

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  9. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

随机推荐

  1. OAF 动态创建组件以及动态绑定属性

    在开发中,我们遇到以下一个需求. 一个表格左侧有5列是固定存在的,右侧有N列是动态生成的,并且该N列中第一列可输入,第二列是不可编辑的,但是是数字,如果小于0,那么就要显示为红色,重点标识出来. 首先 ...

  2. 阿里云ECS安装最新版本Node.js

    原文  http://www.w3ctech.com/topic/1610 主题 Node.js操作系统服务器 我的ECS实例是Ubuntu操作系统,直接使用 apt-get install node ...

  3. vue 表单校验(二)

    vue 表单校验(二) vue element-ui表单校验 由于现在使用element-ui进行form表单校验,因而使用其自带的校验规则进行校验,发现有些并不是那么好校验,或者说是校验起来很繁琐, ...

  4. 用Maven构建Mahout项目

    转载请注明出处:http://blog.fens.me/hadoop-mahout-maven-eclipse/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, ...

  5. elasticsearch配置详解

    一.说明 使用的是新版本5.1,直接从官网下载rpm包进行安装,https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5 ...

  6. DevExpress v17.2新版亮点—WPF篇(五)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v17.2 新的Hamburger Menu.Sched ...

  7. java异常(编程思想)

    通过异常处理错误 java的基本理念是“结构不佳的代码不能运行” 发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前.然而编译期间并不能找出所有的错误,余下的问题必须在运行间解决.这就需要错误 ...

  8. java中的块

    之前没听过这个概念 块是java类中不太常见的一个元素.声明方式与方法体类似,分为static块和实例块两种. 实例块: {块体} 实例块不能直接调用,每一次调用构造方法创建对象的时候,都会在调用构造 ...

  9. HDU 4557

    http://acm.hdu.edu.cn/showproblem.php?pid=4557 解决一类问题的set用法 #include <iostream> #include <c ...

  10. Oracle Tuning (Oracle 性能调整)的一些总结

    Oracle Tuning (Oracle 性能调整)的一些总结 Oracle Tuning (Oracle 性能调整)的一些总结关于Oracle的性能调整,一般包括两个方面,一是指Oracle数据库 ...