1 #include<stdio.h>
2 #include<stdio.h>
3 #include<stack> //queue
4 #include<string.h>
5 using namespace std;
6 stack<char> sck1; //cal
7 stack<char> sck2; //num
8 char ss[20];
9 void transfer(char s[20],int n)
10 {
11 int i;
12 for(i=0;i<n;i++)
13 {
14 if(s[i]=='('){sck1.push(s[i]);}
15 //左括号直接放进去。
16
17 else if(s[i]=='*'||s[i]=='/')
18 {
19 if(sck1.empty()||sck1.top()=='+'||sck1.top()=='-')
20 {
21 sck1.push(s[i]);continue;
22 }
23 //判断如果是空的或者是栈顶是+ -的就直接放入。先进先出。注意点在于判断空得在前面。否则会报错。
24 else
25 {
26 while((!sck1.empty())&&sck1.top()!='(')//这个放到左括号也得考虑啊。
27 {
28 sck2.push(sck1.top());sck1.pop();
29 }
30 sck1.push(s[i]);
31 }
32 //把和自己相同优先级的先拿出来。(因为是从左往右算的)。最后记得放入这个符号。
33 }
34 // * / 符号的做法
35
36 else if(s[i]==')')
37 {
38 while(sck1.top()!='('){sck2.push(sck1.top());sck1.pop();}
39 sck1.pop();
40 }
41 // 右括号。就把运算符都放进数字栈里。直到遇到左括号。最后记得把左括号拿掉。
42 else if(s[i]=='+'||s[i]=='-')
43 {
44 while((!sck1.empty())&&sck1.top()!='(')
45 {
46 sck2.push(sck1.top());
47 sck1.pop();
48 }
49
50 sck1.push(s[i]);
51 }
52 //遇到+ - 符号的话。就把符号都拿出来。最后放入自己的。因为就算相同优先级或者高的优先级。都是一样的。
53
54 else{sck2.push(s[i]);}
55 //数字的话 就直接放进数字栈了。注意不要把2个栈写反写乱了。
56 }
57 while(!sck1.empty())
58 {
59 sck2.push(sck1.top());
60 sck1.pop();
61 }
62 }
63
64 int main()
65 {
66 char s[20];
67 int n;
68 int i;
69 while(scanf("%s",s)!=EOF)
70 {
71 i = 0;
72 n = strlen(s);
73 transfer(s,n);
74 while(!sck2.empty())
75 {
76 ss[i++] = sck2.top();
77 sck2.pop();
78 }
79 printf("%s\n",ss);
80 memset(ss,0,sizeof(ss));
81 }
82 }
83
84 /*
85 1-2*3+4
86 123*-4+
87
88 1-2+3
89 12-3+
90
91 1-2+3-4
92 12-3+4-
93
94 ((1+2)+3)*4
95 12+3+4*
96
97 (1+2)*(3-4)
98 12+34-*
99
100 (1+2)*((1+2)+3)*4
101 12+12+3+*4*
102
103 mark
104 number 1 2 *
105 判空
106 */