坑了老子半天,结果是 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. 根据Time Protocol从NIST Internet Time Servers获取准确时间

    Time Protocol(RFC-868)是一种非常简单的应用层协议:它返回一个32位的二进制数字,这个数字描述了从1900年1月1日0时0分0秒到现在的秒数,服务器在TCP的37号端口监听时间协议 ...

  2. 编写更好的jQuery代码(转)

    这是一篇关于jQuery的文章,写到这里给初学者一些建议. 原文地址:http://flippinawesome.org/2013/11/25/writing-better-jquery-code/ ...

  3. android 使用图片轮播图---banner 使用

    转自:https://github.com/youth5201314/banner 使用步骤 Step 1.依赖banner Gradle dependencies{ compile 'com.you ...

  4. 03-Tomcat服务器

    一.Java分类 JavaSE Java的标准版,一般用来开发桌面应用程序, 但是在开发桌面应用程序上相对VB,Delphi,VC++并没有什么优势. JavaEE 也就是Java Enterpris ...

  5. JDBC增加、更新、删除数据

    JDBC增加.更新.删除数据 st.executeUpdate(sql) 进行插入.更新.删除操作返回的是受影响的记录的条数 注意:输入的sql语句中,vachar类型记住加单引号 完整代码如下: p ...

  6. HDU 2639(01背包第K大)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639 http://blog.csdn.net/lulipeng_cpp/article/details/758 ...

  7. Eclipse3.2查找jre的问题

    前几天遇到一个问题,最开始电脑上使用的是解压的JDK(带jre),但是不能打开jar文件.所以从网上下载了一个jre1.8,然后问题来了,Eclipse打开就报错,弹出一个框,在eclipse的目录下 ...

  8. IDEA使用maven建web项目示例

    运行环境:OSX-10.13.3. IDEA-2017.3.3. maven-3.5.2 步骤1:选择maven-webapp模板新建web项目 步骤2:设置项目GroupId等 需从网上下载相关构件 ...

  9. C++多线程编程(★入门经典实例★)

    原文:http://www.cnblogs.com/codingmengmeng/p/5913068.html 多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对 ...

  10. 在 ubuntu 上运行 php 脚本

    在 ubuntu 上运行 php 脚本 一.配置运行环境 1.要在 ubuntu 上运行 php 脚本,需要安装 Apache2 和 PHP 具体步骤,请参考:Ubuntu 搭建Web服务器(MySQ ...