坑了老子半天,结果是 float 范围不够!!!

基本思想:

  • 开一个符号栈,一个数字栈;
  • 碰到数字就入栈,碰到符号就与栈顶符号进行对比,如果当前符号优先级小于栈顶符号,数字栈弹出两个数进行栈顶符号运算,并将结果压回数字栈;
  • 如果当前符号优先级大于栈顶符号,再将当前符号入栈。

关于优先级,* / 比 + - 高是没得说的,然后规定两个*号(包括/号),前面的优先级更大。当然会造成一些问题(如:5 / 3 * 3会得出一个小数),但这是没办法的。

符号栈初始放置一个‘#’,并规定 ‘#’,优先级低于任何符号。

表达式求值是老问题了,但是之前做的也不太完善,很多小地方还是没注意到,WA了好几次。

1. 终止条件,if (s.length() ==  && s[] == '') break; 否则 0 + ,类似的就不会计算了。
2. 题目只说了小数,真是没想到中间运算float范围还会超

完整代码:

#include <stdio.h>
#include <string>
#include <algorithm>
#include <stack> using namespace std; stack<char>symbol;
stack<double>num; double operation(char c) {
double y = num.top(); num.pop();
double x = num.top(); num.pop();
switch (c) {
case '+':
return x + y;
case '-':
return x - y;
case '*':
return x * y;
case '/':
return x / y;
}
}
int judge(char stackTop, char now) {
switch (now) {
case '+':
case '-':
if (stackTop == '#') return ;
return ;
break;
case '*':
case '/':
if (stackTop == '#' || stackTop == '+' || stackTop == '-') return ;
return ;
break;
}
} int main() {
symbol.push('#');
string s;
int d,t;
while (scanf("%d",&d)) {
char c = getchar();
if (d == && c == '\n') break;
num.push(d);
while (scanf("%c %d", &c, &t)) {
while (judge(symbol.top(), c)) {
num.push(operation(symbol.top()));
symbol.pop();
}
num.push(t);
symbol.push(c);
if ((c = getchar() == '\n')) break;
}
while (symbol.top() != '#') {
num.push(operation(symbol.top()));
symbol.pop();
}
printf("%.2lf\n", num.top());
num.pop();
}
return ;
}

随手练——HDU 1237 表达式求值(输入格式典型)的更多相关文章

  1. hdu 4192 (表达式求值)

    <题目链接> <转载于 >>>  > 题目大意: 给你n个数,和一个最终的结果,再给你一个含有n个不同变量的式子,问你这个式子最终能否得到指定的答案. 解题分 ...

  2. Polynomial Problem(hdu 1296 表达式求值)

    We have learned how to obtain the value of a polynomial when we were a middle school student. If f(x ...

  3. hdu 1237 简单计算器 (表达式求值)【stack】

    <题目链接> 题目大意: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值.  Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符, ...

  4. 用Python3实现表达式求值

    一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...

  5. nyoj305_表达式求值

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

  6. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  7. 数据结构--栈的应用(表达式求值 nyoj 35)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...

  8. NOIP201302表达式求值

    NOIP201302表达式求值 题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计 ...

  9. OpenJudge计算概论-简单算术表达式求值

    /*===================================== 简单算术表达式求值 总时间限制: 1000ms 内存限制: 65536kB 描述 2位正整数的简单算术运算(只考虑整数运 ...

随机推荐

  1. jQuery Ajax实例 ($.ajax_$.post_$.get)

    Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. $.post.$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到j ...

  2. golang代码片段(摘抄)

    以下是从golang并发编程实战2中摘抄过来的代码片段,主要是实现一个简单的tcp socket通讯(客户端发送一个数字,服务端计算该数字的立方根然后返回),写的不错,用到了go的并发以及看下郝林大神 ...

  3. vscode 安装插件,和相关配置

    安装插件,配置对应的用户设置,进行替换,实现插件功能的生效 { // 控制是否在搜索中跟踪符号链接. "search.followSymlinks": false, "e ...

  4. HDU 1575 Tr A----矩阵相乘题。

    Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. poj 2992 Divisors (素数打表+阶乘因子求解)

    Divisors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9617   Accepted: 2821 Descript ...

  6. JDBC入门(2)--- ResultSet之滚动结果集

    一.ResultSet之滚动结果集 ResultSet表示结果集,它是一个二维的表格.ResultSet内部维护一个行光标(游标),ResultSet提供了一系列的方法来移动游标: void befo ...

  7. Tomcat的下载安装及使用

    macOS Sierra Version 10.13.2 环境下Tomcat的下载与安装以及InterlliJ IDEA 2017.2 环境下配置Tomcat 与创建Web项目 一.Tomcat的下载 ...

  8. MySQL9:索引实战 (转)

    构建50万条数据过程: DROP TABLE IF EXISTS `students`; CREATE TABLE `students` ( `s_id` ) NOT NULL AUTO_INCREM ...

  9. 04.CSS选择器-->相邻、通用兄弟选择器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. JS cookie 设置 查看 删除

    JScookie 常用的3个预设函数(库) <!DOCTYPE HTML> <html> <head> <meta charset="utf-8&q ...