普通的计算方式,也叫中缀表达式。计算机识别及正确运用须要耗费大量的资源java
如:23+45*2-(8+2)数据结构
计算机想要正确计算出此时的结果须要十分复杂,更况且状况十分多变。spa
逆波兰式:又叫作后缀表达式,它能去除中缀表达式的括号。十分符合计算机的计算思惟,能极大提升效率code
表达式不能用字符串进行存储,由于这将没法分辨,应用集合(ArrayList,LinkedList存储)blog
如:23 45 2 * 8 2 + - +资源
那么中缀表达式是如何变成后缀表达式的呢?原则以下:字符串
1.首先把普通的表达式按照运算符分离出来放在一个集合E中,好比1+2*3 分离后集合里的元素就是 1 + 2 * 3 五个元素get
2.再定义一个集合R(最好是字符串类型的集合,省得后面要转类型),主要是用来存放逆波兰表达式的,还有定义一个堆栈(存储运算符用),最后从左到右遍历集合E class
3.遍历E的规则以下:test
3.1若是该元素是数字,直接把它添加到集合R中
3.2不然它确定是运算符,那么再进行判断
3.2.1若是该元素是左括号,或者当时栈为空,那么直接入栈
3.2.2若是该元素是右括号,则把栈内的运算符出栈并添加到集合R中,直到遇到第一个左括号结束(左括号也出栈但不添加到R)
3.2.3不然该元素是普通的运算符(也就是+-*/之类的),那么用该运算符和栈内的运算符号比较优先级,若是该运算符的优先级比栈内的运算符
优先级高 或者 栈为空,则直接入栈,不然把栈内的运算符出栈并添加到R中,再判断下个栈内的运算符优先级,直到遇栈内的运
算符优先级<=该运算符或者栈为空时再把该运算符入栈
3.3整个过程完成后,再把栈内的全部运算符出栈并添加到R中
成功获得后缀表达式,但计算机又是如何经过后缀表达式计算出结果的呢?
这就须要运用到数据结构栈的特色
上式具体流程就是;
代码以下;
import java.util.ArrayList; import java.util.ListIterator; import java.util.Scanner; import java.util.Stack; public class test { /** * 将字符串转换为中序表达式 */ public static ArrayList<String> toZhong(String s){ ArrayList<String> arrayList=new ArrayList();//存贮中缀表达式 for(int i=0;i<s.length();i++){ String str=""; if(s.charAt(i)<48||s.charAt(i)>57){//48:0,57:9 str=str+s.charAt(i); arrayList.add(str); } else{ while(i<s.length()&&s.charAt(i)>=48&&s.charAt(i)<=57){ str=str+s.charAt(i); i++; } arrayList.add(str); i--; } } return arrayList; } --------------------------------------------------------------------------------------- /* * 把中缀表达式转成逆波兰式 */ public static ArrayList<String> toNishi(ArrayList<String> list){ ArrayList<String> arr=new ArrayList();//用表存储逆波兰式 Stack<String> timeStack=new Stack();//临时存储操做符 for(String s:list){ if(s.matches("\\d+")){ arr.add(s); } else if(s.equals("(")){ timeStack.push(s); } else if(s.equals(")")){ while(!(timeStack.peek().equals("("))){ arr.add(timeStack.pop()); } } else{ while(timeStack.size()!=0&&getValue(s)<getValue(timeStack.peek())){ arr.add(timeStack.pop()); } timeStack.push(s); } } while(timeStack.size()!=0){ arr.add(timeStack.pop()); } return arr; } public static int getValue(String ss) { if (ss.equals("+")) { return 1; } else if (ss.equals("-")) { return 1; } else if (ss.equals("*")) { return 2; } else if (ss.equals("\\")) { return 2; } return 0; } ------------------------------------------------------------------------------------------ //计算逆波兰式结果 public static int jisuan(ArrayList<String> arr){ Stack<Integer> jieguo=new Stack<Integer>(); for(String s:arr){ if(s.matches("\\d+")){ jieguo.push(Integer.parseInt(s)); } else if(jieguo.size()>=2){ Integer a=jieguo.pop(); Integer b=jieguo.pop(); if(s.equals("+")){ jieguo.push(b+a); } else if(s.equals("-")){ jieguo.push(b-a); } else if(s.equals("*")){ jieguo.push(b*a); } else if(s.equals("//")){ jieguo.push(b/a); } } } return jieguo.pop(); }