nyoj 35-表达式求值(stack, 栈的应用)
35-表达式求值
内存限制:64MB
时间限制:3000ms
Special Judge: No
accepted:37
submit:53
题目描述:
比如输入:“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 分析与步骤:
①、类似于表达式求解问题需要用到栈(stack)的思想(即就是先进后出)
②、遇到数字就将数字放入数字栈中
③、遇到字符串就要分开考虑
1、是‘(’就直接入栈,方便遇到')'时,就将'('以后所有的运算栈带入数字栈运算,结果保存于数字串
2、如果操作栈为空栈直接入栈
3、如果操作栈的栈顶元素优先级小于带输入字符的优先级直接入栈
4、其他情况就是要将数字栈与操作栈结合,算出结果保存在数字栈中
5、数字栈中的最后一个元素即为题解 核心代码(表达式求值模板);
int priority(char c) // 表达优先级的大小关系
{
if (c == '*' || c == '/') return ;
if (c == '+' || c == '-') return ;
return ;
} void cal(stack<char> &my_op, stack<double> &my_num) // 将数字栈与操作栈通过引用的形式实现调用与更改
{
double b = my_num.top();
my_num.pop();
double a = my_num.top();
my_num.pop();
switch(my_op.top())
{
case '+': my_num.push(a + b); break;
case '-': my_num.push(a - b); break;
case '*': my_num.push(a * b); break;
case '/': my_num.push(a / b); break;
}
my_op.pop();
}
for(int i = ; i < len; ++ i) // 判断是因该执行什么操作
{
if(isdigit(s[i]))
{
double temp = atof(&s[i]);
while(isdigit(s[i]) || s[i] == '.') ++ i;
my_num.push(temp);
-- i;
}
else if(s[i] == '(')
{
my_op.push(s[i]);
}
else if(s[i] == ')')
{
while(my_op.top() != '(')
cal(my_op, my_num);
my_op.pop();
}
else if(my_op.empty())
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) < priority(s[i]))
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) >= priority(s[i]))
{
while(!my_op.empty() && priority(my_op.top()) >= priority(s[i])) // 比较的是优先级关系不是ASCⅡ
cal(my_op, my_num);
my_op.push(s[i]);
}
}
C/C++代码实现(AC):
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <set> using namespace std;
const int MAXN = ; int priority(char c) // 表达优先级的大小关系
{
if (c == '*' || c == '/') return ;
if (c == '+' || c == '-') return ;
return ;
} void cal(stack<char> &my_op, stack<double> &my_num) // 将数字栈与操作栈通过引用的形式实现调用与更改
{
double b = my_num.top();
my_num.pop();
double a = my_num.top();
my_num.pop();
switch(my_op.top())
{
case '+':
my_num.push(a + b);
break;
case '-':
my_num.push(a - b);
break;
case '*':
my_num.push(a * b);
break;
case '/':
my_num.push(a / b);
break;
}
my_op.pop();
} int main()
{ int t;
scanf("%d", &t);
while(t --)
{
char s[MAXN];
scanf("%s", s);
int len = strlen(s);
stack <double> my_num;
stack <char> my_op; for(int i = ; i < len; ++ i)
{
if(isdigit(s[i]))
{
double temp = atof(&s[i]);
while(isdigit(s[i]) || s[i] == '.') ++ i;
my_num.push(temp);
-- i;
}
else if(s[i] == '(')
{
my_op.push(s[i]);
}
else if(s[i] == ')')
{
while(my_op.top() != '(')
cal(my_op, my_num);
my_op.pop();
}
else if(my_op.empty())
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) < priority(s[i]))
{
my_op.push(s[i]);
}
else if(priority(my_op.top()) >= priority(s[i]))
{
while(!my_op.empty() && priority(my_op.top()) >= priority(s[i])) // 比较的是优先级关系不是ASCⅡ,my_op.top()忘记放在priority中,弄的找了半天的bug,::>_<::
cal(my_op, my_num);
my_op.push(s[i]);
}
}
my_op.pop();
printf("%.2lf\n", my_num.top());
my_num.pop();
}
return ;
}
nyoj 35-表达式求值(stack, 栈的应用)的更多相关文章
- NYOJ 35 表达式求值(逆波兰式求值)
http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...
- NYOJ 35 表达式求值 (字符串处理)
题目链接 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:&quo ...
- NYOJ 35 表达式求值
一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...
- NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏
#include<iostream> #include<string> #include<stack> #include<cstdio> using n ...
- Matrix Chain Multiplication(表达式求值用栈操作)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/100 ...
- NYOJ 1272 表达式求值 第九届省赛 (字符串处理)
title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...
- 【NYOJ-35】表达式求值——简单栈练习
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...
- nyist0j 35 表达式求值
题目链接:表达式求值 该题以前做过但是WA了,今天终于把他解决了,各种悲剧啊,又是考虑不周到啊................... 所以贴出来纪念一下,并作为一个警示 /**** ps:注意当遇到 ...
随机推荐
- Redis 3.0中文版学习(一)
网址:http://wiki.jikexueyuan.com/project/redis-guide/entry-to-master-a.html http://www.yiibai.com/redi ...
- Async,Await和ConfigureAwait的关系
[转自]https://mp.weixin.qq.com/s/h10V-FshGoaQUWFPfy-azg 在.NET Framework 4.5中,async / await关键字已添加到该版本中, ...
- opencv::源码编译
环境:win10.vs2017.cmake .java.python3.7默认安装. opencv源码:opencv-.zip opencv拓展库源码:opencv_contrib-.zip (注意: ...
- php架构师都要会什么
架构师的成长离不开踩坑,不断试验各种方案,各种踩坑,从小坑到大坑,逐渐归纳.另外就是多学习多交流,兼收并蓄,不用特别在意细节,观其大略,了解常见的各种东西的核心价值与短板所在.一个程序和计算系统软件体 ...
- java面试官:兄弟简单谈谈Static、final、Static final各种用法吧
前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...
- Apache2的安装
Apache2的安装 1.执行:sudo apt-get install apache2. 2.sudo vim /etc/apache2/apache2.conf在最后加上:ServerName l ...
- (六)添加adbmingling
给环境变量Path添加adb命令路径,即adb.exe所在的目录 C:\Users\LIU Liang\AppData\Local\Android\Sdk\platform-tools
- 如何让多个不同类型的后端网站用一个nginx进行反向代理实际场景分析
前段时间公司根据要求需要将聚石塔上服务器从杭州整体迁移到张家口,刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合,断断续续一个月迁移完成 大概优化掉了1/3的机器,完成之后遇到了一些问题,比如曾今 ...
- Vue中错误图片的处理
在一个Vue的PC项目中,要求给错误图片不要让它显示丑陋的图片,就要给图片写一个失败后的默认图片, 在这里写了两种方法, 第一种方法,也就是百度到的最多的代码,就是给一张图片一个默认值. 第二种问题, ...
- 清华大学教学内核ucore学习系列(1) bootloader
ucore是清华大学操作系统课程的实验内核,也是一个开源项目,是不可多得的非常好的操作系统学习资源 https://github.com/chyyuu/ucore_lab.git, 各位同学可以使用g ...