逆波兰计算器实现
前缀表达式又称为波兰表达式,后缀表达式又称为逆波兰表达式
实现过程
1、输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果
2、支持小括号和多位数,本例简化为支持对整数计算
3、思路分析:
还是以(3+4)*5-6为例,其对应后缀表达式为3 4 + 5 * 6 -
1.从左到右扫描,将3和4压入栈(4为栈顶元素,3为次顶元素),
2.遇到+运算符,计算3+4d的值,为7并将7压入栈;
3.将5入栈
4.遇到*运算符,弹出5和7,计算结果为35,将35压入栈;
5.将6入栈
6.最后是-运算符,弹出35和6,计算出35-6得到最终结果29。
代码实现
package com.atxihua; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class PolandNotation { public static void main(String[] args) { //先定义给逆波兰表达式 //测试 //说明为了方便,逆波兰表达式的数字和符号使用空格隔开 String suffixExpression="3 4 + 5 * 6 -";//29 /* * 思路 * 先将 suffixExpression 放到ArrayList中 * 将ArrayList传递给一个方法,遍历ArrayList配合栈 完成计算 * */ List<String> list=getListString(suffixExpression); System.out.println("rpnList="+list); int res=calculate(list); System.out.println("计算的结果是:"+res); } //将一个逆波兰表达式,依次将数据和运算符放入到ArrayList中 public static List<String> getListString(String suffixExpression){ //将suffixExpression分隔,注意" "之间有空格 String[] split=suffixExpression.split(" "); List<String> list=new ArrayList<>(); for(String ele:split){ list.add(ele); } return list; } /* * 完成对逆波兰表达式的运算 * 从左只右扫描,将3和4压入堆栈 * 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值等于7,再将7入栈 * 将5入栈 * 接下来是*(乘)运算符,因此弹出5和7,计算得到结果35,再将35入栈 * 将6入栈 * 最后是-运算符,计算35-6的值,即29,由此得到最终结果 * */ public static int calculate(List<String> ls){ //创建一个栈即可 Stack<String> stack=new Stack<String>(); //遍历ls for(String item:ls){ //这里使用正则表达式来取出数 if(item.matches("\\d+")){ //匹配的是多位数 //入栈 stack.push(item); }else{ //pop出两个数,并运算,再入栈 int num2=Integer.parseInt(stack.pop()); int num1=Integer.parseInt(stack.pop()); int res=0; if(item.equals("+")){ res=num1+num2; }else if(item.equals("-")){ //注意num2比num1先出栈,所以是num1-num2 res=num1-num2; }else if(item.equals("/")){ res=num1/num2; }else if(item.equals("*")){ res= num1*num2; }else { throw new RuntimeException("运算符有误"); } //把res入栈 stack.push(""+res); } } //最后留在栈中的是计算结果 return Integer.parseInt(stack.pop()); } }
运行结果: