hdu - 1237 题解

题意:给出一个数字计算式,包含+,-,*,/四种符号,计算值

题解:最大坑点:不能仅仅判断第一个是0就结束计算,有可能有:0 + 1这样的情况

所以1.判断第一个是否是0,如果是,则判断下一个符号是否是‘\n‘

2.读入数字和运算符,如果是*,/,取出栈顶元素直接计算完成后压栈,如果是-,将数字相反数压栈,如果是+,将数字压栈。

3.计算栈内元素之和

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<stack>
 5 using namespace std;
 6 stack<double> st;
 7 int main()
 8 {
 9     int x;
10     while(true)
11     {
12         scanf("%d",&x);
13         char c;
14         c=getchar();
15         if(x==0&&c==‘\n‘)
16         {
17             break;
18         }
19         while(!st.empty())
20         {
21             st.pop();
22         }
23         st.push(x);
24         while(true)
25         {
26             if(c==‘\n‘)
27             {
28                 break;
29             }
30             while(c==‘ ‘)
31             {
32                 c=getchar();
33             }
34             scanf("%d",&x);
35             if(c==‘*‘)
36             {
37                 double tmp=st.top();
38                 st.pop();
39                 st.push(tmp*x);
40             }
41             if(c==‘/‘)
42             {
43                 double tmp=st.top();
44                 st.pop();
45                 st.push(tmp/x);
46             }
47             if(c==‘-‘)
48             {
49                 st.push(-x);
50             }
51             if(c==‘+‘)
52             {
53                 st.push(x);
54             }
55             c=getchar();
56         }
57         double res=0;
58         while(!st.empty())
59         {
60             res+=st.top();
61             st.pop();
62         }
63         printf("%.2lf\n",res);
64     }
65     return 0;
66 }
时间: 2024-10-24 06:32:56

hdu - 1237 题解的相关文章

HDU 1237

http://acm.hdu.edu.cn/showproblem.php?pid=1237 表达式计算,方法是中缀转后缀,再计算.中间处理用栈操作 讲解看http://blog.csdn.net/antineutrino/article/details/6763722 这题是简易版本的,不用处理括号 #include <iostream> #include <cstdio> #include <cstring> #include <stack> using

HDU 1237 简单计算器(栈)

题目链接 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00

2014年北京网络赛 Instrusive HDU 5040 题解 优先队列

网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点,若干墙,若干监视器,剩下的是空地. 起点,终点,监视器都算空地. 监视器初始值会指定一个方向,共有四个方向. 监视器每秒顺时针转动到下个方向. 监视器视野距离为2. 在监视器的位置或在监视器面向的格子是监视区域. 普通的移动一格需要消耗1秒时间. 在监视器下移动一格需要消耗3秒时间. 如果呆在原地不

hdu - 1231 题解

题意:最大连续子序列问题+输出答案所在的区间 题解:最大连续子序列问题状态转移方程:f[i]=max(a[i],f[i-1]+a[i]) 答案所在区间的话可以在递推求状态的时候,顺便记录一下当前位置所在的序列左端点是谁,最后扫描的时候记录下最优解的位置,然后这个位置就是右端点,记录过的数据就是左端点. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring&g

[JAVA][HDU 1237][九度 1019][简单计算器]

本来以为是一道很简单的stack题目,居然花了四五十分钟来解决,JAVA本身就有stack的应用优势,但还是花了自己很多时间.. 提供一些要点吧: 1.首先是来自九度的测试案例 1 + 2 5 4 + 2 * 5 - 7 / 11 3 0 + 5 1 - 2 * 3 * 4 + 5 * 6 1 * 2 * 3 + 5 + 6 - 7 * 8 + 9 / 10 0 + 0 * 0 1 + 5 * 0 0 + 5 0 2.输入0时结束,但是运算到0的时候不结束,这个应该很容易排除 3.输出之前再检查

HDU 5573 题解

题意:关于一只要续命的青蛙(雾),一颗完全二叉树,它的标号正如我们所期望的根为1,左儿子为父节点*2,右儿子为父节点*2+1,然后老青蛙从根往下走,一共走K步,它需要n个灵魂,每走过一个点,可以减去或加上这个点的标号,输出一种可能方案,输入数据保证至少有一组解 1=<n<=1e9,N<=2k<=260 共1~100组数据,1000MS 题解/思路:其实这道题找一下规律就好了,你会发现最左边两条路径分别可以表示±1,±3,--,±(2k-1)和±2,±4,--,±2k,所以只需判断这

hdu 5418 题解

第一眼看到这题,哇,这不是我刚做完的题吗?大水题!然后 这题表面很水,实际上有点坑. 题意 求经过 $ 1 - n $(不能遗漏) 并且回到 $ 1 $ 的最短路. 在看这题之前我们可以来看下这题 最短Hamilton路 这道题的要求是我们要让每个点不重不漏的经过并且最终到达 $ n-1 $ 我们看数据范围,就可以直接状压dp,枚举状态. 由于题目已经给出最短路,便可以直接计算 #include<bits/stdc++.h> using namespace std; int n,a[30][3

HDU 5521 题解

题意:给出n个点,John需要和一个住在第n个点的人在某个点碰面,再给出m个集合,每个集合中包含Si个点,这些点两两之间可以以ti时间互达,求两人需花费的最小时间,若无法走到第n个点,则输出Evil John. 2<=N<=100000;1<=ti<=1e9;Si>0;∑Si<=1e6; 共1~6组数据,6000MS 算法/思路: 第一次见到这种套路的话还是蛮有趣的,对每个集合中两两点建边显然会被轻松TLE. 使用最短路+虚拟节点:于是我们对每个集合建立一个虚拟节点,在

*HDU 1237 栈

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19060    Accepted Submission(s): 6711 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整