NYOJ 35 表达式求值 (栈 stack)
2016-06-21 12:19
288 查看
题目35
题目信息
运行结果
本题排行
讨论区
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
样例输出
原文地址:http://blog.csdn.net/piaoyi0208/article/details/7822686
题意:给一个中缀表达式 求出表达式的值
操作符优先级:(从大到小) ‘(’ —— ‘ * ’ 或 ‘ / ’ —— '+' 或 ‘-’ —— ‘ )’ ;(把括号也看作操作符)
思路:用两个栈,一个操作符栈,一个数据栈,顾名思义,数据栈存表达式的数据,操作符栈存 ()+ - * / 等。将中缀表达式转换为后缀表达式,在转换的过程中求表达式的值!具体步骤如下:(下面思路假设数据都是一位数的整数,便于理解,具体数字处理在代码中体现)
先将 一个’=‘ 放入 操作符栈
1:读取表达式的一个字符;
2: 若为数字存入数据 栈 转至1;
3:若为操作符:比较操作符栈顶 和 该操作符的 优先级
① pk函数返回值 为 ’>‘(若操作符栈顶优先级大于或等于该操作符的优先级):栈顶操作符出栈(假设操作符为-) ,从数据栈出两个数据(假设第一个是y,第二个 是x),计算值(x-y),注意数据顺序!!将值放入 数据栈!转至 3;
② pk函数返回值为’<‘ (若操作符栈顶优先级小于该操作符的优先级): 讲该 操作符放入 操作符栈,转至 1;
③ pk函数返回值为’=‘ (具体看代码) 将操作符栈顶的操作符出栈,转至1;
4:输出数据栈栈顶值即可!
题目信息
运行结果
本题排行
讨论区
表达式求值
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述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
原文地址:http://blog.csdn.net/piaoyi0208/article/details/7822686
题意:给一个中缀表达式 求出表达式的值
操作符优先级:(从大到小) ‘(’ —— ‘ * ’ 或 ‘ / ’ —— '+' 或 ‘-’ —— ‘ )’ ;(把括号也看作操作符)
思路:用两个栈,一个操作符栈,一个数据栈,顾名思义,数据栈存表达式的数据,操作符栈存 ()+ - * / 等。将中缀表达式转换为后缀表达式,在转换的过程中求表达式的值!具体步骤如下:(下面思路假设数据都是一位数的整数,便于理解,具体数字处理在代码中体现)
先将 一个’=‘ 放入 操作符栈
1:读取表达式的一个字符;
2: 若为数字存入数据 栈 转至1;
3:若为操作符:比较操作符栈顶 和 该操作符的 优先级
① pk函数返回值 为 ’>‘(若操作符栈顶优先级大于或等于该操作符的优先级):栈顶操作符出栈(假设操作符为-) ,从数据栈出两个数据(假设第一个是y,第二个 是x),计算值(x-y),注意数据顺序!!将值放入 数据栈!转至 3;
② pk函数返回值为’<‘ (若操作符栈顶优先级小于该操作符的优先级): 讲该 操作符放入 操作符栈,转至 1;
③ pk函数返回值为’=‘ (具体看代码) 将操作符栈顶的操作符出栈,转至1;
4:输出数据栈栈顶值即可!
#include <iostream> #include <cstring> #include <iomanip> #include <cstdlib> #include <stack> using namespace std; int n; char str[1010]; char ok[220]; int end, loop; int len; char pk(char c1, char c2) { if (c1 == '+' || c1 == '-'){ if (c2 == '+' || c2 == '-' || c2 == ')' || c2 == '=') return '>'; else return '<'; } else if (c1 == '*' || c1 == '/'){ if (c2 == '+' || c2 == '-' || c2 == '*' || c2 == '/' || c2 == ')' || c2 == '=') return '>'; else return '<'; } else if (c1 == '(' || c1 == '='){ if ((c1 == '(' && c2 == ')') || (c1 == '=' && c2 == '=')) return '='; else return '<'; } } double oper(double x, char c, double y) { if (c == '+') return x + y; else if (c == '-') return x - y; else if (c == '*') return x * y; else return x / y; } int main() { cin >> n; while (n--){ end = 0, loop = 0; stack<char> sc; sc.push('='); stack<double> s; cin >> str; len = strlen(str); for (int i = 0; i < len;){ if (str[i] == '=' && sc.top() == '=') break; if (isdigit(str[i]) || str[i] == '.'){ ok[end++] = str[i]; loop = 1; i++; continue; } if (loop){ ok[end] = '\0'; double x = atof(ok); //把字符串转换成浮点数值 end = 0, loop = 0; s.push(x); } switch(pk(sc.top(), str[i])){ case '<': sc.push(str[i]); i++; break; case '=': sc.pop(); i++; break; case '>': double x, y; y = s.top(); s.pop(); x = s.top(); s.pop(); char c = sc.top(); sc.pop(); s.push(oper(x, c, y)); break; } } cout << setprecision(2) << fixed << s.top() << endl; } return 0; }
相关文章推荐
- 大宗师手游源码分享 这是一个大型RPG卡牌游戏 源码有1.6GB
- Linux下的定时器以及POSIX定时器:timer_settime()
- Android UiAutomator:UiWatcher的使用
- linux常用shell
- 简单的例子谈java的并发
- linux yum命令详解
- 最大连续子向量(分治策略和扫描算法)
- 高仿QQ最新版本的安卓APP源码 界面华丽 还有WIFI-FTP功能
- 分享录制的正则表达式入门、高阶以及使用 .NET 实现网络爬虫视频教程
- windows 下安装 redis
- NYOJ 5 Binary String Matching (KMP)
- Android多线程总结(转载)
- ROS学习--语音合成&语音识别
- Swift必备开发库(高级篇)
- Swift必备开发库(高级篇)
- JSONKit在iOS9上编译Error解决办法
- exports 和 module.exports 的区别
- ButterKnife笔记
- 采用PHP函数uniqid生成一个唯一的ID
- 微信语音下载到服务器 上传到七牛转换为mp3