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


    题目描述

    对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

    输入

    输入一个算术表达式,以‘#’字符作为结束标志。

    输出

    输出该表达式转换所得到的后缀式。

    示例输入

    a*b+(c-d/e)*f#

    示例输出

    ab*cde/-f*+
    View Code
     1 #include<stdio.h>
     2 int swi(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     return 0 ;
     9 }
    10 int main()
    11 {
    12     int top = 0 ;
    13     char c=0, stack[100] ;
    14     while(scanf("%c", &c), c!='#')
    15     {
    16         if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出
    17         {
    18             printf("%c", c) ;
    19         }
    20         else
    21         {
    22             if(top==0)//判断b栈是不是为空 是就直接入栈
    23             {
    24                 top++ ;//栈顶向上移一位
    25                 stack[top] = c ;//增加一个成员
    26             }
    27             else
    28             if(swi(c)>=swi(stack[top]))]))//如果是运算符 而且输入的比栈顶运算符优先级高
    29             {
    30                 if(swi(c)==4))//如果是')'就把'('之前的运算符全部输出
    31                 {
    32                     while(stack[top]!='(')
    33                     {
    34                       printf("%c",stack[top--]) ;
    35                     }
    36                     top-- ;
    37                 }
    38                 else
    39                 {
    40                     top++ ;//如果不是 就入栈
    41                     stack[top] = c ;
    42                 }
    43             }
    44             else//如果优先级比它低
    45             {
    46                 if(stack[top]!='(')//如果不是'(' 就把它(优先级高)出栈
    47                 {
    48                   printf("%c", stack[top]) ;
    49                   stack[top] = c ;
    50                 }
    51                 else
    52                 {
    53                     top++ ;
    54                     stack[top] = c ;//如果是'(' 就直接入栈
    55                 }
    56             }
    57         }
    58     }
    59     while(top!=0)//判断栈是否为空 不为空就全部出栈
    60     {
    61         printf("%c", stack[top]) ;
    62         top-- ;
    63     }
    64     printf("\n") ;
    65     return 0 ;
    66 }

      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    ·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束 */

  • 相关阅读:
    C#获取当前日期时间(转)
    c#截取字符串split各种用法
    c#国际化
    C#密码加密
    c#程序中对密码进行加密的方法
    百度信誉认证体系初级实名认证即将取消,这意味着什么?
    新增利息宝-京东淘宝唯品会自动抢单系统源码搭建过程
    webapp/H5封装,混开APP,没有原生APP好?事实是这样的吗?
    laravel基础laravle中orm简单的增删改查-一颗优雅草男神你姚哥
    Thinkphp二次开发威客RW平台源码详细搭建教程(技术分享帖)-一颗优雅草科技yungui
  • 原文地址:https://www.cnblogs.com/yelan/p/2873432.html
Copyright © 2020-2023  润新知