HDU-1237 简单计算器 题解

题目大意

给你一个中缀表达式,求出这个表达式的值。

解题思路

基础的STL栈运用。

需要将中缀转后缀或者前缀。

这个是之前的基础的题了,表达式不包括括号。

加括号的以后在写吧。。目前懒得去找了。

不过其实也差不多,就是括号需要特殊处理罢了。

至于分割数字和符号的话,个人比较喜欢用stringstream。

特别好用。

转表达式的方法我就不多赘述了。

这里

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <cstring>
#include <cstdio>
#include <sstream>
#include <stack>
using namespace std;

int priority[220];
stack<string>sc;
stack<double>si;
string ans[220];

double solve(double n1, double n2, char ch) {
switch (ch) {
case'+':return n1 + n2;
case'-':return n1 - n2;
case'*':return n1 * n2;
case'/':return n1 / n2;
}
}

int main() {
string s;
stringstream ss;
priority['+'] = 0;
priority['-'] = 0;
priority['*'] = 1;
priority['/'] = 1;
while (getline(cin, s) && s != "0") {
ss.clear();
ss << s;
int flag = 0;
while (ss >> s) {
//cout << s << endl;
if ((s[0] >= '0' && s[0] <= '9') || s.length() > 1) {
ans[flag++] = s;
}
else {
if (sc.empty() || (!sc.empty() && priority[s[0]] > priority[sc.top()[0]])) {
sc.push(s);
}
else {
while (!sc.empty() && priority[s[0]] <= priority[sc.top()[0]]) {
ans[flag++] = sc.top();
sc.pop();
}
sc.push(s);
}
}
}
while (!sc.empty()) {
ans[flag++] = sc.top();
sc.pop();
}
for (int i = 0; i < flag; i++) {
//cout << ans[i] << endl;
if ((ans[i][0] >= '0' && ans[i][0] <= '9') || ans[i].length() > 1) {
double n = stod(ans[i]);
si.push(n);
}
else {
double n1 = si.top();
si.pop();
double n2 = si.top();
si.pop();
si.push(solve(n2, n1, ans[i][0]));
}
}
double num = si.top();
si.pop();
printf("%.2lf\n", num);
}
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2015-2021 sakurakarma
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信