1 #include <iostream>
2 #include <stack>
3 #include <cctype>
4
5 using namespace std;
6
7 //获取符号的优先级
8 int getPriority(char c)
9 {
10 int priority = -1;
11 switch (c) {
12 case '+':
13 priority = 1;
14 break;
15 case '-':
16 priority = 1;
17 break;
18 case '*':
19 priority = 2;
20 break;
21 case '/':
22 priority = 2;
23 break;
24 case '(':
25 priority = 3;
26 break;
27 default:
28 break;
29 }
30 return priority;
31 }
32
33
34 int main()
35 {
36 char c;
37 stack<char> s;
38 cin >> c;
39 while (c != '#')
40 {
41 while (isdigit(c))
42 {
43 cout << c;
44 cin >> c;
45 if(!isdigit(c) && c != '#')
46 cout << ' ';
47
48 }
49 if (c == ')')
50 {
51 //1.弹出元素并输出直到'('
52 while (s.top() != '(')
53 {
54 cout << s.top() << ' ';
55 s.pop();
56 }
57 //2.将"("也出栈
58 s.pop();
59 }
60 else
61 {
62 // 下面是普通操作符的情况
63 // 1.弹出栈元素直到发现优先级更低的元素
64 while (!s.empty() && getPriority(c) <= getPriority(s.top()) && s.top() != '(')
65 {
66 cout << s.top() << ' ';
67 s.pop();
68 }
69 //将本操作符入栈
70 s.push(c);
71 }
72 cin >> c;
73 }
74 while (!s.empty())
75 {
76 cout << s.top() << ' ' ;
77 s.pop();
78 }
79 cout << endl;
80 return 0;
81 }