1 /* 将中缀表达式(a+b)转换为后缀表达式(ab+)的算法思想:   
 2    ·当读到数字直接送至输出队列中   
 3    ·当读到运算符t时,   
 4       a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;     
 5       b.t进栈   
 6    ·读到左括号时总是将它压入栈中   
 7    ·读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。   
 8    
 9       运用后缀表达式进行计算的具体做法:   
10    ·建立一个栈S   
11    ·从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X   运算符   Y”的形式计算机出结果,再压加栈S中   
12    ·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束 */
13 #include<stdio.h>
14 int switc(char c)//把输入的运算符转换成数字来比较优先级
15 {
16     if(c=='+'||c=='-') return 1;
17     if(c=='*'||c=='/')  return 2;
18     if(c=='(') return 3;
19     if(c==')') return 4;
20 }
21 int main()
22 {
23     int top=0;
24     char c,b[100];//b数组算是个栈吧
25     while(scanf("%c", &c),c!='#')//输入直到#结束
26     {
27         if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出
28         {
29             printf("%c",c);
30         }
31         else
32         {
33             if(top==0) //判断b栈是不是为空 是就直接入栈
34             {
35                 top++;//栈顶向上移一位
36                 b[top] = c;//增加一个成员                
37             }
38             else
39                 if(switc(c)>=switc(b[top]))//如果是运算符 而且输入的比栈顶运算符优先级高
40                 {
41                     if(switc(c) == 4)//如果是')'就把'('之前的运算符全部输出
42                     {
43                         while(b[top]!='(')
44                         {
45                             printf("%c",b[top--]);
46                         }
47                         top--;
48                     }
49                     else
50                         {
51                             top++;//如果不是 就入栈
52                             b[top] = c;                            
53                         }
54                 }
55                 else //如果优先级比它低
56                 {
57                     if(b[top]!='(') //如果不是'(' 就把它(优先级高)出栈
58                     {
59                         printf("%c", b[top]);
60                         b[top] = c;
61                     }
62                     else
63                     {
64                         top++;
65                         b[top] = c;//如果是'(' 就直接入栈                        
66                     }
67                 }
68         
69         }
70             
71     }
72     while(top!=0) //判断栈是否为空 不为空就全部出栈
73     {
74         printf("%c",b[top]);
75         top--;
76     }
77     printf("\n");return 0;
78 }