一、概念:1、中缀表达式:表示运算符号在数字中间,即是我们日常在数学上面理解的表达式。
2、后缀表达式:计算机上运用的计算方法,通常将运算符号放在数字后面,在进行运算时从左到右进行遍历读取、计算。
3、前缀表达式:也是计算机上面运用的计算方法,只不过是不同于后缀表达式的方法,其运算符号在数字前面,而且在进行计算时是从右到左进行遍历和计算。
二、中缀转后缀的方法:
1、官方话语:首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为存放结果(逆波兰式)的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤
2、个人理解利用栈转置:首先定义两个栈,一个为存放数字的栈,一个是存放运算符号的栈。并且只要遇到数字就出栈,如果存放运算符号的栈开始为空,则将遇到的运算符号放进栈。然后根据以下条件进行判断,运算符号的进栈和出栈。条件:(1)若取出的字符是操作数 (eg, 6, 3, 7 ),则分析出完整的运算数,该操作数直接送入S2栈。
(2)若取出的字符是运算符 (eg: ( * / - )),则将该运算符与S1栈栈顶元素比较,如果该运算符(不包括括号运算符)优先级高于S1栈栈顶运算符(包括左括号)优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符(包括左括号)低于(不包括等于)该运算符优先级时停止弹出运算符,最后将该运算符送入S1栈。
(3)若取出的字符是“(”,则直接送入S1栈顶。
(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
(5)重复上面的1~4步,直至处理完所有的输入字符。
(6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。
如果表达式结束,但栈中还有元素,将所有元素出栈,添加到后缀表达式中。
三、后缀表达式的运算:
1、首先从左到右进行遍历,凡是遇到数字按遍历先后的顺序依次放入栈中。
2、当遇到运算符号时,则将栈中提取两个栈元素,但是提取的数据按顺序按栈顶先出的顺序进行提取,首先第一个数据放在运算符的右边,第二个数据放在运算符的左边,进行运算。
3、当此运算符号的运算结束后,再将得到的数据,再放进入栈中,接着依次进行运算即可。
4、当运算结束将最后结果拿出即可。