35-表达式求值

内存限制:64MB
时间限制:3000ms
Special Judge: No

accepted:37
submit:53

题目描述:

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 分析与步骤:
  ①、类似于表达式求解问题需要用到栈(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, 栈的应用)的更多相关文章

  1. NYOJ 35 表达式求值(逆波兰式求值)

    http://acm.nyist.net/JudgeOnline/problemset.php?typeid=4 NYOJ 35 表达式求值(逆波兰式求值) 逆波兰式式也称后缀表达式. 一般的表达式求 ...

  2. NYOJ 35 表达式求值 (字符串处理)

    题目链接 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:&quo ...

  3. NYOJ 35 表达式求值

    一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...

  4. NYOJ - 35 表达式求值 分类: NYOJ 2015-03-18 10:33 31人阅读 评论(0) 收藏

    #include<iostream> #include<string> #include<stack> #include<cstdio> using n ...

  5. Matrix Chain Multiplication(表达式求值用栈操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/100 ...

  6. NYOJ 1272 表达式求值 第九届省赛 (字符串处理)

    title: 表达式求值 第九届省赛 nyoj 1272 tags: [栈,数据结构] 题目链接 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表 ...

  7. 【NYOJ-35】表达式求值——简单栈练习

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  8. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

  9. nyist0j 35 表达式求值

    题目链接:表达式求值 该题以前做过但是WA了,今天终于把他解决了,各种悲剧啊,又是考虑不周到啊................... 所以贴出来纪念一下,并作为一个警示 /**** ps:注意当遇到 ...

随机推荐

  1. Docker安装ELK并实现JSON格式日志分析

    ELK是什么 ELK是elastic公司提供的一套完整的日志收集以及前端展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch.Logstash和Kibana. 其中Logstash ...

  2. opencv实践::对象计数

    问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通过二值分割+形态学处理+距离变换+连通区域计算 #include <opencv ...

  3. 微信小程序——获取formid

    小程序对模板消息推送做了相应的限制:如果用户主动触发小程序表单提交1次,小程序可在7天内向用户主动推送1条模版消息,如果用户通过小程序完成支付,小程序可在7天内向用户主动推送3条模版消息.(formi ...

  4. 5G:今天不谈技术,谈谈需求和应用

    4G改变生活,5G改变社会.随着2019年5G手机的发布,5G时代已经拉开帷幕,无数嗅觉灵敏的投资人和创业者在研究5G行业的投资机会. 但是,市场研究侧重于技术细节与上游产业链设备投资居多,对于贴近消 ...

  5. PHP5底层原理之垃圾回收机制

    概念 垃圾回收机制 是一种内存动态分配的方案,它会自动释放程序不再使用的已分配的内存块. 垃圾回收机制 可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑. 与之相关的一个概念,内存 ...

  6. mybatis 使用redis实现二级缓存(spring boot)

    mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...

  7. 将windows项目移植到linux上

    提要:由于项目使用java开发,移植中没有什么编译问题(移植很快,但小问题多) 1.移植过程中遇到的问题: (1).由于项目中使用了 1024以下的端口号,导致网络通信一直出错 原因:因为Linux要 ...

  8. Python 的多线程是鸡肋?

    "唉,还没毕业就受到甲方的支配,等以后进了公司可咋整啊."小白嘴里这么吐槽,但心理上还是不敢怠慢,只能恋恋不舍地关掉眼前的游戏,打开了 Python 代码思考了起来. " ...

  9. 小白 Python 爬虫部署 Linux

    前言 前面国庆节的时候写过一个简易的爬虫. <Python 简易爬虫实战> 还没看过的同学可以先看一下,这只爬虫主要用来爬取各个博客平台的阅读量等数据,一直以来都是每天晚上我自己手动在本地 ...

  10. 设计模式C++描述----07.建造者(Builder)模式

    一. 概述 Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步 ...