3.1模拟题 problem3 某计算器的超电磁炮

题目描述
输入由非负整数、+、-、*、/、(、)组成的计算表达式,计算该表达式的值。

输入
每个输入文件中一组数据。

输入只有一行,不超过200个字符,其中不存在空格。数据保证表达式一定合法,且所有的整数都不小于0、不大于1024。中间结果保证不超过15位有效数位精度。

输出
输出一行,即表达式的值,结果精度保留小数点后2位。

样例输入
3+(12/(2*2+1))
样例输出
5.40

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
#include <stack>
#include <ctype.h>
#include <iostream>
using namespace std;
struct node{
double num;
char op;
bool flag;
};
string str;
stack<node> s;//操作符栈
queue<node> q;//后缀表达式列
map<char, int> op;
void change(){
double num;
node temp;
for (int i = 0; i < str.length(); ) {
if (isdigit(str[i])) {
temp.flag = true;//是数字
temp.num = str[i++] - '0';
while (i < str.length() && isdigit(str[i])) {
temp.num = temp.num * 10 + str[i] - '0';
i++;
}
q.push(temp);
}else if(str[i] == '('){
temp.op = str[i];
s.push(temp);
i++;
}else if(str[i] == ')'){
while (!s.empty() && s.top().op != '(') {
q.push(s.top());
s.pop();
}
s.pop();
i++;
}else{//是操作符
temp.flag = false;
while (!s.empty() && op[s.top().op] >= op[str[i]]) {
q.push(s.top());
s.pop();
}
temp.op = str[i];
s.push(temp);
i++;
}
}
while (!s.empty()) {
q.push(s.top());
s.pop();
}
}
double cal(){
double temp1, temp2;
node cur, temp;
while (!q.empty()) {
cur = q.front();
q.pop();
if (cur.flag == true) {//是数字
s.push(cur);
}else{
temp2 = s.top().num;
s.pop();
temp1 = s.top().num;
s.pop();
temp.flag = true;
if (cur.op == '+') {
temp.num = temp1 + temp2;
}else if(cur.op == '-'){
temp.num = temp1 - temp2;
}else if(cur.op == '*'){
temp.num = temp1 * temp2;
}else if(cur.op == '/'){
temp.num = temp1 / temp2;
}
}
}
return s.top().num;
}
int main(){
op['('] = op[')'] = 0;
op['+'] = op['-'] = 1;
op['*'] = op['/'] = 2;
getline(cin, str);
change();
printf("%.2f\n",cal());

return 0;
}