• 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  }
  • 相关阅读:
    算法疑难(js实现)---5、变态跳台阶
    算法疑难(js实现)---4、跳台阶(记忆化递归)
    算法疑难(js实现)---3、两个栈来实现一个队列
    算法疑难(js实现)---2、重建二叉树
    Ext的Panel总结(好文章)
    Extjs datefield 日历控件中文显示
    EXTJS项目实战经验总结一:日期组件的change事件:
    ExtJs内的datefield控件选择日期过后的事件监听select
    ExtJs FormPanel布局
    开发extjs常用的插件
  • 原文地址:https://www.cnblogs.com/timeship/p/2600623.html
Copyright © 2020-2023  润新知