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:注意当遇到 ...
随机推荐
- PHP array_replace_recursive
1.函数的作用:比较键值,递归的替代数组中的元素 2.函数的参数: @params array $array1 @params array $array2 @params array $array3 ...
- Prometheus 源码解读(一)
Prometheus 源码解读(一) Prometheus 是云原生监控领域的事实标准,越来越来的开源项目开始支持 Prometheus 监控数据格式.从本篇开始,我将和大家一起阅读分析 Promet ...
- opencv实践::直线检测
问题描述 寻找英语试卷填空题的下划线,这个对后期的切图与自动 识别都比较重要. 解决思路 方法: 通过图像形态学操作来寻找直线,霍夫获取位置信息与显示. #include <opencv2/op ...
- php函数分为哪两种?
PHP的真正威力源自于它的函数.函数分为内置函数和自定义函数. 内置函数 所谓PHP内置函数,就是在php程序的库里面已经定义了的函数,比如echo,mysql_connect,include_onc ...
- 微信小程序单选/多选框样式重新
/* 重写 checkbox 样式 */ /* 未选中的 背景样式 */ checkbox .wx-checkbox-input{ border-radius: 50%;/* 圆角 */ width: ...
- 深度讲解Linux内存管理和Linux进程调度-打通任督二脉
我在多年的工程生涯中发现很多工程师碰到一个共性的问题:Linux工程师很多,甚至有很多有多年工作经验,但是对一些关键概念的理解非常模糊,比如不理解CPU.内存资源等的真正分布,具体的工作机制,这使得他 ...
- Spring 源码阅读之 深入理解 finishBeanFactoryInitialization
源码入口 上篇博文中我们看到了将Spring环境中的 BeanPostProcessor找出来,添加到BeanFactory中的beanPostProcessors中,统一维护,本片博文继续往下拓展, ...
- CSS布局解决方案(终结版)
作者:无悔铭 https://segmentfault.com/a/1190000013565024 前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环.在页面框架的搭建之中,又有居中布局.多 ...
- 在Mac平台用Sublime编辑器使用Git并连接github
近期闲来无事,学习一下Git版本控制的东西,首先是要在我的pc上学会如何向git上提交我的代码,记录一下过程以及遇到的问题. 一.Mac下Sublime Text 3整合Git 来源于一个技术教程:h ...
- ggstatsplot绘图|统计+可视化,学术科研神器
本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/zdSit97SOEpbnR18ARzixw 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. ...