中缀表达式转后缀表达式和前缀表达式

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

    (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 ‘<‘;
        }
    }
}

  

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

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

/*
中缀化前缀的运算符比较函数,运算符栈栈顶元素跟当前运算符优先级比较。
*/
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 ‘<‘;
        }
    }
}

  

时间: 2024-10-06 01:09:54

中缀表达式转后缀表达式和前缀表达式的相关文章

7-21 求前缀表达式的值(25 分)

前缀表达式的计算机求值:从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈:重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果.例如前缀表达式"- × + 3 4 5 6":(1) 从右至左扫描,将6.5.4.3压入堆栈:(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈:(3) 接下来是×运算符,因此

中缀表达式转换成前缀表达式和后缀表达式

35,15,+,80,70,-,*,20,/                   //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式 /,*,+,35,15,-,80,70, 20                 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我

[转]中缀表达式、前缀表达式、后缀表达式的相互转换

--------------------------------后缀转中缀---------------------------------------------- 1.建立一个栈,从左向右扫描后缀表达式,遇到运算数则压入栈: 2.遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果作为新的运算符再压入栈: 3.依次走到表达式结尾: 例:把逆波兰式(即后缀表达式)ab+c*转换为中缀表达式: 1)a入栈(0位置) 2)b入栈(1位置) 3)遇到运算符"+",将a和b出栈,执行a+b的

算术表达式的前缀表达式,中缀表达式和后缀表达式

这里所谓的前缀,中缀,后缀是根据操作符的位置来定的,如果操作符在操作数前面,则称为前缀表达式,例如"- + 1 × + 2 3 4 5";如果操作符在操作数之间,则称为中缀表达式,例如 "1+((2+3)×4)-5";如果操作符在操作数后面,则称为后缀表达式,例如"1 2 3 + 4 × + 5 -". 虽然中缀表达式符合人类的日常思维习惯,但是计算机在存储中缀表达式时,需要使用树这种数据结构,如果表达式过于复杂,那么树的高度会变得很高,大大增加

中缀表达式到前缀表达式和后缀表达式

1.算法思路 转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈. 转化为前缀:从右到左遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于等于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于当前操作符的操作符,当前操作符进栈.--参考该网址 以上方法需要先定义操作符优先级,当然,可以定义.但是这样会麻烦许多,那么不如用括号来进行进行限定.这样就不需要写判断

前缀表达式、中缀表达式和后缀表达式

前缀.中缀.后缀表达式 前缀.中缀.后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理 举例: 中缀表达式:1 + (2 + 3) × 4 - 5 前缀表达式:- + 1 × + 2 3 4 5 后缀表达式:1 2 3 + 4 × + 5 - 中缀表达式 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中

栈的应用之中缀表达式转后缀表达式

1,中缀表达式的定义及为什么要将中缀表达式转换为后缀表达式? 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值要比中缀表达式简单. 比如,计算机计算后缀表达式的过程如下----后缀表达式的计算机求值: 从左

数据结构中缀表达式转后缀表达式以及后缀转中缀表达式

最近一直在看数据结构这本书,我相信,对于每个程序员来说,数据结构都尤为重要.为什么要学,可以看看这位博友的认识http://blog.csdn.NET/sdkfjksf/article/details/54380659 直入主题:将中缀表达式转为后缀表达式 以及将后缀表达式转为前缀表达式的实现. 关于后缀转中缀,中缀转后缀的理论介绍,请先阅读其互转的理论知识,或者我转发的这篇文章,这里不再累赘,最好参考<数据结构与算法描述Java语言版>,接下来将会用java写. 一.首先,怎么实现中缀表达式

java中缀表达式转后缀表达式

四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等于栈顶优先级栈顶元素出栈并输出为后缀表达式一部分(注意这里是递归比较栈顶元素的优先级并出栈),最后将当前元素入栈直到遍历完中缀表达式,最终输出后缀表达式 下面是自己的实现源码 package com.yhq.demospringboot; import org.apache.commons.lang