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. Black Widow CodeForces - 704C (dp)

    大意: 给定一个m个bool变量的方程, 求方程解的个数 给定方程的形式类似于这样 每个括号是一个子式, 每个子式里变量数不超过2, 每个变量出现次数不超过2, 方程右侧一直是1 对每个变量出现的式子 ...

  2. 『cs231n』RNN之理解LSTM网络

    概述 LSTM是RNN的增强版,1.RNN能完成的工作LSTM也都能胜任且有更好的效果:2.LSTM解决了RNN梯度消失或爆炸的问题,进而可以具有比RNN更为长时的记忆能力.LSTM网络比较复杂,而恰 ...

  3. SVN 创建分支

    TortoiseSVN Client创建分支:

  4. 【转】jieba.NET与Lucene.Net的集成

    首先声明:我对Lucene.Net并不熟悉,但搜索确实是分词的一个重要应用,所以这里还是尝试将两者集成起来,也许对你有一参考. 看到了两个中文分词与Lucene.Net的集成项目:Lucene.Net ...

  5. spark RDD操作的底层实现原理

    RDD操作闭包外部变量原则 RDD相关操作都需要传入自定义闭包函数(closure),如果这个函数需要访问外部变量,那么需要遵循一定的规则,否则会抛出运行时异常.闭包函数传入到节点时,需要经过下面的步 ...

  6. 简话Angular 03 Angular内置表达式大全

    一句话: 大多数html标签属性和事件都有一个对应的ng指令 说明:这些指令和原生html最大的区别就是可以动态更新.比如一个div的样式用ng-class后,我们就可以随意应用css class. ...

  7. IIS6.0发布后对路径“D:\xxx\xxxx\web.config”的访问被拒绝问题的解决方法

    原来我本机发布后还是可以直接通过浏览器访问,这几天不知道怎么就不行,终于在网上找到解决方法 IIS发布后访问xxx/xxx/web.config路径被拒绝的问题截图如下: 解决方法: 1.在本地或服务 ...

  8. cas 服务端认证流程

    CAS服务端流程分析 'CAS单点登录服务器端的登录流程' -----流程的配置在/WEB-INF/login-webflow.xml文件中 <var name="credential ...

  9. DevExpress v18.1新版亮点——WPF篇(四)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v18.1 的新功能,快来下载试用新版本!点击下载& ...

  10. <NET CLR via c# 第4版> 读书笔记--目录

    <NET CLR via c# 第4版>个别章节虽读过多次,但始终没有完整读过这本书.即使看过的那些,时间一长,也忘记了大部分.趁着最近不忙,想把这本书好好读一遍,顺便记下笔记,方便随时查 ...