- 题目描述:
- 对于一个不存在括号的表达式进行计算
- 输入:
- 存在多种数据,每组数据一行,表达式不存在空格
- 输出:
- 输出结果
- 样例输入:
- 6/2+3+3*4
- 样例输出:
- 18
1 #include <stdio.h>
2 #include <stack>
3 #include <string.h>
4 #include <cctype>
5 using namespace std;
6
7 int pri[5][5] = { { 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0 }, { 1,
8 1, 1, 0, 0 }, { 1, 1, 1, 0, 0 } };//定义操作符优先级
9 stack<double> s;
10 stack<int> op;
11
12 int find(char c) {
13 switch (c) {
14 case '#':
15 return 0;
16 case '+':
17 return 1;
18 case '-':
19 return 2;
20 case '*':
21 return 3;
22 case '/':
23 return 4;
24 }
25 }
26
27 int main() {
28 char st[101], *p;
29 double r, x, y, tmp;
30 int c, a;
31 while (~scanf("%s",st)) { //换成gets(st)将bug,具体原因不是很清楚,我猜测可能是与我用*p有关,现在还是新手解释不了
32 int len = strlen(st);
33 st[len++] = '#';
34 st[len] = 0;
35 op.push(0);
36 p = st;
37 while (*p) {
38 a = *p++ - '0';
39 while (isdigit(*p))
40 a = 10 * a + *p++ - '0';//获取操作数
41 s.push((double)a);
42 while (!pri[find(*p)][op.top()] && op.size() >= 2) {
43 x = s.top();
44 s.pop();
45 y = s.top();
46 s.pop();
47 c = op.top();
48 op.pop();
49 if (c == 1)
50 tmp = x + y;
51 else if (c == 2)
52 tmp = y - x;
53 else if (c == 3)
54 tmp = x * y;
55 else if (c == 4)
56 tmp = y / x;
57 s.push(tmp);
58 }
59 op.push(find(*p++));
60 if (op.size() == 2 && !op.top()) {
61 printf("%.lf\n", s.top());
62 s.pop();op.pop();op.pop();
63 break;
64 }
65 }
66 }
67 return 0;
68 }