zoukankan      html  css  js  c++  java
  • 中缀表达式转后缀表达式和前缀表达式

    注:这里只是简单的加减乘除运算即含小括号的情况,并没有考虑单目运算符的情况。

    中缀表达式化后缀表达式:

        (1+3)/8*3-5=

        构建一个空运算符栈。先向里面压入一个'='(方便后边的比较)。然后从左向右扫描中缀表达式,如果是操作数,则直接输出即可;如果是左括号则直接入栈,如果是右括号,则弹栈,直到左括号且将左括号也弹出;如果是其他运算符,则按照乘除优先于加减,如果是乘除(加减)则按照谁先进栈谁优先,即a优先于b表示为a>b,如果栈顶元素优先于当前元素,则一直弹栈,直到栈顶优先级小于当前元素优先级,将当前元素压栈,如果优先级相同,只需弹栈就可以了。

    /*比较栈顶元素跟当前运算符优先级*/
    char suf_compare(char op1,char op2){
        if(op1=='+'||op1=='-'){
            if( op2=='(' || op2=='*' || op2=='/')
                return '<';
            else return '>';
        }
        if(op1=='*'||op1=='/'){
            if(op2=='(')
                return '<';
            else return '>';
        }
        if(op1=='='||op1=='('){
            if((op1=='='&&op2=='=')||(op1=='('&&op2==')')){
                return '=';
            }else{
                return '<';
            }
        }
    }
    

    后缀表达式求值:

    建立一个缓存计算结果的空栈,从左往右遍历后缀表达式,如果遇到操作数,就直接压入栈,如果遇到操作符,就从栈顶依次取出操作数,op1,op2作为右操作数和左操作数,处理到等式右侧,最后栈中存的结果,即为所求表达式值。

      

    中缀表达式化前缀表达式:

        构建两个栈,一个缓存运算符空栈(压入‘=’)和一个存前缀表达式的空栈。从右往左扫描中缀表达式,如果是操作数,则直接压入表达式栈;如果是右括号,则直接入运算符栈,如果是左括号,则将运算符栈弹栈转移压入表达式栈,直到遇到右括号,舍弃括号。如果是其他运算符,则按照乘除优先于加减,如果是乘除(加减)则按照谁后进栈谁优先。如果栈顶元素优先于当前元素,则一直弹栈,直到栈顶优先级小于当前元素优先级,将当前元素压栈,如果优先级相同,只需弹栈就可以了。最后将表达式栈依次弹栈,就得到了前缀表达式。

    /*
    中缀化前缀的运算符比较函数,运算符栈栈顶元素跟当前运算符优先级比较。
    */
    char pre_compare(char a,char b){
        if(a=='+'||a=='-'){
            if(b=='('||b=='='){
                return '>';
            }else{
                return '<';
            }
        }
        if(a=='*'||a=='/'){
            if(b==')'||b=='*'||b=='/'){
                return '<';
            }else{
                return '>';
            }
        }
        if(a==')'||a=='='){
            if(a==')'&&b=='('||a=='='&&b=='='){
                return '=';
            }else{
                return '<';
            }
        }
    }
    

    前缀表达式求值:

    建立缓存结果空栈,从右往左处理表达式,如果遇到数字,则将这个数字完整地提取出来,加入栈中,如果是操作符,则从栈顶依次取出op1,op2作为左操作数和右操作数,做相应计算后,将结果入栈,最后处理到最左侧时,栈顶即为表达式值。

  • 相关阅读:
    c# webapi 在swagger里添加全局过滤器
    axios get,post请求时带headers
    svn"重新定位"提示版本库uuid不匹配
    DevExpress XtraReport
    DevExpress GridControl List绑定方式下新增行的方法
    对Dev的GridControl/GridView控件进行分组并展开操作
    DevExpress GridControl控件行内新增、编辑、删除添加选择框
    JavaScript 中的FileReader对象(实现上传图片预览)
    数据库连接情况查询
    C#代码中实现两个表(DataTable)的关联查询(JOIN)
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4457526.html
Copyright © 2011-2022 走看看