后缀表达式(逆波兰表达式)的计算---栈实现
Posted xiaoboxueit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后缀表达式(逆波兰表达式)的计算---栈实现相关的知识,希望对你有一定的参考价值。
后缀表达式的计算,代码如下:
1 package com.pangzi.stucture; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Stack; 6 7 //逆波兰表达式 8 public class PolandNotation { 9 10 public static void main(String[] args) { 11 //定义一个逆波兰表达式 12 //(3+4)*5-6 => 34+5*6- 中缀转后缀 13 String suffixExpression = "3 4 + 5 * 6 -"; 14 //先将表达式放入arrayList里面 15 //将arraylist传递给一个方法,然后遍历list配合栈完成计算 16 List<String> rpnList = getListString(suffixExpression); 17 18 int res = calculate(rpnList); 19 20 System.out.println(res);//打印结果 21 22 }
首先定义一个main方法,然后在其中定义需要计算的表达式,并传入后面需要实现的方法里。方法实现如下:
1 //将逆波兰表达式放入arraylist中 2 public static List<String> getListString(String suffixExpression){ 3 //将suffixExpression分割 4 String[] split = suffixExpression.split(" "); 5 List<String> list = new ArrayList<String>(); 6 //遍历数组,放入list 7 for(String ele:split){ 8 list.add(ele); 9 } 10 return list; 11 }
将表达式放入list
1 //完成对逆波兰表达式的运算 2 //从左至右扫描,遇到数字就直接压栈,遇到运算符就弹出栈中存在的数字(栈顶元素和次顶元素)并进行计算, 3 //次顶在前,栈顶在后这样进行计算,然后将结果入栈,不断重复得出最终结果。 4 public static int calculate(List<String> ls){ 5 //创建一个栈 6 Stack<String> stack = new Stack<String>(); 7 //遍历ls 8 for(String item:ls){ 9 //使用正则表达式取出数 10 if(item.matches("\d+")){ 11 stack.push(item);//如果是数就把它放进去 12 }else{//如果不是数字就pop出两个数并运算,然后再入栈 13 int num2 = Integer.parseInt(stack.pop());//先弹栈的顶元素 14 int num1 = Integer.parseInt(stack.pop());//后弹栈的次顶元素 15 int res = 0;//定义运算结果 16 if(item.equals("+")){ 17 res = num1 + num2; 18 }else if(item.equals("-")){ 19 res = num1 - num2; 20 }else if(item.equals("*")){ 21 res = num1 * num2; 22 }else if(item.equals("/")){ 23 res = num1 / num2; 24 }else{ 25 throw new RuntimeException("运算符有误,请检查"); 26 } 27 //把res入栈 28 stack.push(""+res); 29 } 30 } 31 //最后留在栈中的就是这个结果,将字符串转换为int并返回。 32 return Integer.parseInt(stack.pop()); 33 } 34 }
然后对表达式进行计算,并返回结果。
以上是关于后缀表达式(逆波兰表达式)的计算---栈实现的主要内容,如果未能解决你的问题,请参考以下文章