一. 后缀表达式:
后缀表达式,逆波兰表达式,是指运算符位于操作符之后,计算机对该式是从做到右进行计算,计算过程如下例子
二.计算思路
对于后缀表达式的计算,需要一个栈即可,
即遇见数字压栈,遇见运算符从栈中取出两个数,根据运算进行操作,
需要注意的是,减法以及除法都是后出栈作为减数或除数,先出栈的作为被减数或者被除数.
最后将计算结果压入该栈,计算完毕.
本章给出的是逆波兰表达式(后缀表达式)的计算Demo,为了便于计算,在给出的后缀表达式中加入了空格,并且使用list集合进行遍历,至于中缀怎么转变成后缀,后面文章会给出案例.
代码如下:
package com.ebiz.stack;import java.util.ArrayList; import java.util.List; import java.util.Stack;/*** @author YHj* @create 2019-07-24 14:17* 逆波兰表达式,实现计算器*/ public class NiPoLandCalculator {public static void main(String[] args) {//定义一个逆波兰表达式(后缀表达式) (30+4)*5-6 => 30 4+5*6-//为了方便,数字以及运算符之间用空格隔开String expression="30 4 + 5 * 6 - ";List<String> list = getList(expression);int resul=getResult(list);System.out.println("resul = " + resul);}//输出计算结果private static int getResult(List<String> list) {Stack<String> stack = new Stack<>();for (String s : list) {//匹配数字,可匹配多位数if (s.matches("\\d+")){stack.push(s);}else {int num01=Integer.parseInt(stack.pop());int num02=Integer.parseInt(stack.pop());int result=0;if (s.equals("+")){result=num01+num02;}else if (s.equals("-")){result=num02-num01;}else if (s.equals("*")){result=num02*num01;}else if (s.equals("/")){result=num02/num01;}else {throw new RuntimeException("无法解析的字符串");}stack.push(""+result);}}return Integer.parseInt(stack.pop());}//将表达式的值以空格进行拆分,加入到arraylist中,便于操作(不适用索引)private static List<String> getList(String str) {String[] split = str.split(" ");ArrayList<String> list = new ArrayList<>();for (String s : split) {list.add(s);}return list;}}