逆波兰表达式中缀表达式转换为后缀表达式
生活随笔
收集整理的這篇文章主要介紹了
逆波兰表达式中缀表达式转换为后缀表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
中綴表達式轉換為后綴表達式
思路分析
代碼實現
package com.atguigu.stack;import javax.swing.plaf.nimbus.State; import java.security.AlgorithmConstraints; import java.util.ArrayList; import java.util.List; import java.util.Stack;/*** @創建人 wdl* @創建時間 2021/3/20* @描述*/ public class PolandNotation {public static void main(String[] args) {//完成一個中綴表達式轉換成后綴表達式的功能//說明//1."1+((2+3)×4)-5"=>"1 2 3 + 4 × + 5 –"//2.因為直接對一個str進行操作,不方便,因此先將"1+((2+3)×4)-5"=>中綴的表達式對應的List//即"1+((2+3)×4)-5"=>ArrayList[....//3.將得到的中綴表到時對應的List轉換成后綴表達式ListString expression="1+((2+3)*4)-5";List<String> infixExpressionList = toInfixExpressionList(expression);System.out.println("中綴表達式對應的List"+infixExpressionList);List<String> parseSuffixExpreesionList = parseSuffixExpreesionList(infixExpressionList);System.out.println("后綴表達式對應的List"+parseSuffixExpreesionList);System.out.println("expression="+calculate(parseSuffixExpreesionList));// //先定義一個逆波蘭表達式 // // (3+4)×5-6 對應的后綴表達式就是 3 4 + 5 × 6 - // //說明為了方便,逆波蘭表達式的數字和符號使用空格隔開 // String suffixExpression="3 4 + 5 * 6 -"; // //思路 // //1.先將"3 4 + 5 × 6 -"放到ArrayList中 // //2.將ArrayList傳遞給一個方法,遍歷ArrayList配合棧完成計算 // List<String> rpnList=getListString (suffixExpression); // System.out.println(rpnList); // // int res=calculate(rpnList); // System.out.println("計算的結果是="+res);}public static List<String> parseSuffixExpreesionList(List<String> ls){//定義兩個棧Stack<String> s1=new Stack<String>();//符號棧//說明:因為s2這個棧,在整個轉換過程中,沒有pop操作,而且我們后面還需要逆序輸出//因此比較麻煩,這里我們就不用Stack<String>直接使用List<String> s2//Stack<String> s2=new Stack<String>();存儲中間結果的棧s2List<String> s2 = new ArrayList<>();//存儲中間結果的List2//遍歷lsfor(String item:ls){//如果是一個數,加入到s2if (item.matches("\\d+")){s2.add(item);}else if (item.equals("(")){s1.push(item);}else if(item.equals(")")){//如果是右括號“)”,則依次彈出s1棧頂的運算符,并壓入s2,// 直到遇到左括號為止,此時將這一對括號丟棄while (!s1.peek().equals("(")){s2.add(s1.pop());}s1.pop();//!!!將(彈出s1棧,消除小括號}else{//當item的優先級小于等于棧頂運算符的優先級,將s1棧頂的運算符彈出并加入到s2中,// 再次轉到(4.1)與s1中新的棧頂運算符相比較;//問題:我們缺少一個比較優先級高低的方法while (s1.size()!=0&&Operation.getValue(s1.peek()) >= Operation.getValue(item)){s2.add(s1.pop());}//還需要將item壓入棧s1.push(item);}}//將s1中剩余的運算符依次彈出并加入s2while (s1.size()!=0){s2.add(s1.pop());}return s2;//注意因為是存放到List,因此按順序輸出就是對應的后綴表達式對應的List}//方法:將中綴表達式轉換成對應的Listpublic static List<String> toInfixExpressionList(String s){//定義一個List,存放中綴表達式對應的內容List<String> ls = new ArrayList<>();int i=0;//這時是一個指針,用于遍歷中綴表達式字符串String str;//對多位數的拼接工作char c;//每遍歷一個字符,就放入到cdo{//如果c是一個非數字,我們就需要加入到lsif((c=s.charAt(i))<48||(c=s.charAt(i))>57){ls.add(c+"");i++;//i需要后移}else {//如果是一個數,需要考慮多位數str="";//先將str置成""while (i<s.length()&&((c=s.charAt(i))>=48&&(c=s.charAt(i))<=57)){str+=c;//拼接i++;}ls.add(str);}}while (i<s.length());return ls;//返回}//將一個逆波蘭表達式,依次將數據和運算符放到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,計算出7×5=35,將35入棧; // 將6入棧; // 最后是-運算符,計算出35-6的值,即29,由此得出最終結果public static int calculate(List<String> ls){//創建一個棧,只需要一個棧即可Stack<String> stack = new Stack<>();//遍歷 lsfor(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("-")){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+"");}}//最后留在stack中的數據就是運算結果return Integer.parseInt(stack.pop());}}//編寫一個類Operation返回一個運算符對應的優先級 class Operation{private static int ADD=1;private static int SUB=1;private static int MUL=2;private static int DIV=2;//寫一個方法,返回對應的優先級數字public static int getValue(String operation){int result=0;switch (operation){case "+":result=ADD;break;case "-":result=SUB;break;case "*":result=MUL;break;case "/":result=DIV;break;default:System.out.println("不存在該運算符");break;}return result;}}總結
以上是生活随笔為你收集整理的逆波兰表达式中缀表达式转换为后缀表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂虾怎么做好吃 蚂虾做法
- 下一篇: 150. 逆波兰表达式求值---JAVA