nyoj 表达式求值
35-表达式求值
内存限制:64MB 时间限制:3000ms Special Judge: No
accepted:19 submit:26
题目描述:
比如输入:“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 表达式求值的更多相关文章
- NYOJ 1272 表达式求值 第九届省赛 (字符串处理)
title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...
- NYOJ 35 表达式求值(逆波兰式求值)
http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- nyoj 305 表达式求值 (递归)
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
随机推荐
- 『PyTorch』第十二弹_nn.Module和nn.functional
大部分nn中的层class都有nn.function对应,其区别是: nn.Module实现的layer是由class Layer(nn.Module)定义的特殊类,会自动提取可学习参数nn.Para ...
- git在eclipse中的配置 转载
git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...
- ajax ajax基本介绍
jquery中ajax方法参数详解 url 要求是string类型参数(默认为当前页面地址) 发送请求的地址 type 要求是string类型的参数,请求方式(post或get)默认为get.注意其他 ...
- Awk 从入门到放弃(5)– Awk模式(Pattern)之一
转:http://www.zsythink.net/archives/1426
- 最全的CSS浏览器兼容问题【FF与IE】
1. Div居中问题 div设置 margin-left, margin-right 为 auto 时已经居中,IE 不行,IE需要设定body居中,首先在父级元素定义text-algin: cent ...
- POJ 2309 BST(树状数组Lowbit)
题意是给你一个满二叉树,给一个数字,求以这个数为根的树中最大值和最小值. 理解树状数组中的lowbit的用法. 说这个之前我先说个叫lowbit的东西,lowbit(k)就是把k的二进制的高位1全部清 ...
- 【笔记】《深入浅出MFC》第5章 总观Application Framework
凝聚性强.组织化强的类库就是Application Framework.一组合作无间的对象,彼此藉消息的流动而沟通,并且互相调用对方的函数以求完成任务,这就是Application Framework ...
- 关于Oracle的一些基础知识以及注意事项
一.oracle基础 1.1 DDL(Data Definition Language) 数据定义语言 create drop,desc(注意,此操作只能在PL/SQL Developer的命令窗户执 ...
- apache中的RewriteCond、RewriteRule
Rewirte主要的功能就是实现URL的跳转.可基于服务器级的(httpd.conf)和目录级的(.htaccess) 两种方式.如果要想用到rewrite模块,必须先安装或加载rewrite模块. ...
- TreeView添加treeView1_NodeMouseClick----多么痛的领悟。。。
TreeView添加treeView1_NodeMouseClick----多么痛的领悟... 1首先说一点,通过参考代码,已经实现了菜单项自动添加到TreeView控件的树视图了. 2.在移植(菜单 ...