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


     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 }
  • 相关阅读:
    POJ 1088 滑雪
    POJ 2243 Knight Moves
    poj1847
    poj1995
    poj2230
    poj2007
    poj2376
    socket与TcpListener/TcpClient/UdpClient 的区别及联系
    利用DescriptionAttribute定义枚举值的描述信息
    可以关注的Android网上信息
  • 原文地址:https://www.cnblogs.com/shangyu/p/2346526.html
Copyright © 2020-2023  润新知