SDUT 2132 数据结构实验之栈二:一般算术表达式转换成后缀式

题目链接http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2132

/* 将中缀表达式(a+b)转换为后缀表达式(ab+)的算法思想:
·当读到数字直接送至输出队列中
·当读到运算符t时,
a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;
b.t进栈
·读到左括号时总是将它压入栈中
·读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。

运用后缀表达式进行计算的具体做法:
·建立一个栈S
·从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中
·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束 */

View Code
 1  #include<stdio.h>

 2  int switc(char c)//把输入的运算符转换成数字来比较优先级

 3  {

 4      if(c=='+'||c=='-') return 1;

 5      if(c=='*'||c=='/')  return 2;

 6      if(c=='(') return 3;

 7      if(c==')') return 4;

 8  }

 9  int main()

10  {

11      int top=0;

12      char c,b[100];//b数组算是个栈吧

13      while(scanf("%c", &c),c!='#')//输入直到#结束

14      {

15          if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出

16          {

17              printf("%c",c);

18          }

19          else

20          {

21              if(top==0) //判断b栈是不是为空 是就直接入栈

22              {

23                  top++;//栈顶向上移一位

24                  b[top] = c;//增加一个成员                

25              }

26              else

27                  if(switc(c)>=switc(b[top]))//如果是运算符 而且输入的比栈顶运算符优先级高

28                  {

29                      if(switc(c) == 4)//如果是')'就把'('之前的运算符全部输出

30                      {

31                          while(b[top]!='(')

32                          {

33                              printf("%c",b[top--]);

34                          }

35                          top--;

36                      }

37                      else

38                          {

39                              top++;//如果不是 就入栈

40                              b[top] = c;                            

41                          }

42                  }

43                  else //如果优先级比它低

44                  {

45                      if(b[top]!='(') //如果不是'(' 就把它(优先级高)出栈

46                      {

47                          printf("%c", b[top]);

48                          b[top] = c;

49                      }

50                      else

51                      {

52                          top++;

53                          b[top] = c;//如果是'(' 就直接入栈                        

54                      }

55                  }

56          

57          }

58              

59      }

60      while(top!=0) //判断栈是否为空 不为空就全部出栈

61      {

62          printf("%c",b[top]);

63          top--;

64      }

65      printf("\n");return 0;

66  }

你可能感兴趣的:(数据结构)