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 ...
随机推荐
- dp入门求最大公共子序列
#include "bits/stdc++.h" using namespace std; ],b[]; ][]; int main() { cin >> a > ...
- windows创建窗口、关闭窗口流程
NC,即 non-client 区域,包括标题栏.窗口边框.最大.最小按钮.滚动条等. 一.在调用Windows的::CreateWindowEx函数创建窗口时,一般会先发出 WM_NCCREATE消 ...
- simulate mdns message
use dns-sd command simulate mdns message: dns-sd -R test _test._tcp local 1234 a=1111111111111111111 ...
- SQL中游标的使用(转)
http://www.cnblogs.com/tianguook/archive/2011/03/09/1977987.html 一般情况下,我们用SELECT这些查询语句时,都是针对的一行记录而言, ...
- jenkins的流水线pipeline+项目实验php
声明:实验环境使用Jenkins的应用与搭建的环境 新建一个流水线 pipeline脚本语法架构 node('slave节点名'){ def 变量 #def可以进行变量声明 stage('阶段名A') ...
- bzoj2014
题解: 按照单价排序 然后贪心 代码: #include<bits/stdc++.h> using namespace std; ; typedef long long ll; ll an ...
- selenium(一)简介,安装,配置,测试。
简介: Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mozilla S ...
- php通过$_SERVER['HTTP_USER_AGENT']获取浏览器useAgent
php通过$_SERVER['HTTP_USER_AGENT']获取浏览器useAgent
- logging- 日志记录
https://www.cnblogs.com/yyds/p/6901864.html logging提供给了两种记录日志的方式: 第一种方式是使用logging提供的模块级别的函数 import l ...
- 驱动程序多线程 PsCreateSystemThread
内核函数PsCreateSystemThread负责创建新线程.该函数可以创建两种线程,一种是用户线程,它属于当前进程中的线程.另一种是系统线程,系统线程不属于当前用户进程,而是属于系统进程,一般PI ...