8、逆波兰表达式(后缀表达式)

  • 1 中缀表达式转后缀表达式(从左到右)
方法一:直接转换法
(1)首先确定表达式表达式A的运算顺序,然后加括号:((1 + (( 2 + 3)* 4 )) – 5 )

(2)从最里面的一层括号开始运算,转换成后缀表达式的方法为:(忽略括号)数字在前,符号在后。

          1)( 2 + 3) => 23+

          2)  (( 2 + 3)* 4 ) => 23+4*

          3) (1 + (( 2 + 3)* 4 ))=> 123+4*+     [按照运算次序,从左到右排列]

          4)((1 + (( 2 + 3)* 4 )) – 5 )=> 123+4*+ 5-

    后缀表达式为:12 3 + 4 * + 5 –
    
方法二:利用表达式树(未详细看)

https://blog.csdn.net/qq_33243189/article/details/80222629

首先将中缀表达式转换为表达式树,然后后序遍历表达式树,所得结果就是后缀表达式。
将中缀表达式转化为表达式树的方法:表达式树的树叶是操作数,而其他节点为操作符,根结点为优先级最低且靠右的操作符(如上述表达式优先级最低是-和+,但-最靠右,所以根为-),圆括号不包括。如上述表达式的表达式树为:
  • 2 中缀表达式转为前缀表达式(从右到左)
https://blog.csdn.net/qq_33243189/article/details/80222629

假定有中缀表达式1 + (( 2 + 3)* 4 ) – 5,请将它转化为前缀表达式。
方法一:直接转换法
(1)首先确定表达式表达式A的运算顺序,然后加括号:((1 + (( 2 + 3)* 4 )) – 5 )

(2)从最里面的一层括号开始运算,转换成前缀表达式的方法为:(忽略括号)符号在前,数字在后。

          1)( 2 + 3) => +23

          2)  (( 2 + 3)* 4 ) => *+234

          3) (1 + (( 2 + 3)* 4 ))=>  +1*+234   

          4)((1 + (( 2 + 3)* 4 )) – 5 )=> -+1*+2345

    前缀表达式为:-+1*+2345
    

方法二:利用表达式树

首先将中缀表达式转换为表达式树,然后先序遍历表达式树,所得结果就是前缀表达式。

将中缀表达式转化为表达式树的方法:表达式树的树叶是操作数,而其他节点为操作符,根结点为优先级最低且靠右的操作符(如上述表达式优先级最低是-和+,但-最靠右,所以根为-),圆括号不包括。

经过前序遍历所得前缀表达式为:- + 1 * + 2 3 4 5

注:数字的相对位置不变,变得只是运算符的位置;

  • 3 用后缀表达式(逆波兰表达式)编计算器。
思路:
应用到一个系统栈,从左到右遍历逆波兰表达式,遇到数字,进栈,遇到操作符,出栈,拿出两个数进行运算,并将结果继续入栈,重复操作即可
代码:
package stack;


import java.util.Stack;
public class PolandNotation {
	public static void main(String[] args) {	
		//用后缀表达式,计算(逆波兰表达式),用系统栈代替
		//(3+4)*5-6 => 后缀表达式为,34+5*6-
		String expression = "3 4 + 5 * 6 -";
		//思路:
		//1、先将 "3 4 + 5 * 6 -"放入数组中,
		//2、遍历数组,配合栈,完成运算
		String[] strings = expression.split(" ");
		Stack stack = new Stack();
		int i = 0;
		String oper;
		while(true) {
			if(i>=strings.length) {
				break;
			}
			if(strings[i].matches("\\d+")) {//正则表达式,是数,则入栈
				stack.push(Integer.parseInt(strings[i]));
			}else {//是符号
				oper = strings[i];
				stack.push(calculator(stack.pop(),stack.pop(),oper));	
			}
			i++;			
		}
		System.out.println("最终结果:"+stack.pop());
		
	}
	private static Integer calculator(int pop1, int pop2, String oper) {
		// TODO Auto-generated method stub
		int res = 0;
		switch (oper) {
		case "+":
			res = pop2 + pop1;
			break;
		case "-":
			res = pop2 - pop1;
			break;
		case "*":
			res = pop2 * pop1;
			break;
		case "/":
			res = pop2 / pop1;
			break;
		default:
			throw new RuntimeException("运算符错误,请检查!");
		}
		return res;
	}
}

你可能感兴趣的:(数据结构)