演算法-藍橋杯-演算法訓練 表示式計算 (JAVA)
阿新 • • 發佈:2019-02-05
1 引言
什麼題。。。
2 題目
問題描述
輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含一個表示式。輸出格式 輸出這個表示式的值。樣例輸入1-2+3*(4-5)樣例輸出-4資料規模和約定 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。3 原始碼
import java.util.*; public class Main { public static void main(String[] args) { Stack od=new Stack();//數字棧 Stack op=new Stack();//符號棧 Scanner sc=new Scanner(System.in); String str=sc.nextLine(); int index=0;//記錄已經執行的符號數 int length=str.length(); //System.out.println(length); while(index<length) { //System.out.println("第"+index+"步++++++++++"); char c=str.charAt(index);//取出這一步的符號 if(c=='(') { //System.out.println(c+"-------進棧"); op.push(c);//若是左括號就進棧 } //否則要先判斷優先順序 else if(c=='+' || c=='-' || c=='*'|| c=='/') { int currOplevel=getOplevel(c);//當前符號的優先順序 while(true) { int stackOplevel=0;//棧頂元素的優先順序 if(op.isEmpty()==false) { Object obj=op.peek(); stackOplevel=getOplevel((char)obj); } //若當前元素優先順序大於棧頂元素的優先順序則入棧 if(currOplevel>stackOplevel) { // System.out.println(c+"-------進棧"); op.push(c); break;//直到讓比自己優先順序高的符號都出棧運算了再把自己進棧 } else//不能入棧就進行計算 { try{ char optemp='0'; int odnum1=0; int odnum2=0; if(op.isEmpty()==false) { optemp=(char)op.pop();//取出優先順序大的那個符號 } if(od.isEmpty()==false) { odnum1=(int)od.pop(); odnum2=(int)od.pop();//取出資料棧中的兩個數 } // System.out.println(optemp+" "+odnum1+" "+odnum2); //System.out.println(cacuResult(optemp,odnum2,odnum1)+"-------進棧"); od.push(cacuResult(optemp,odnum2,odnum1));//將算出來的結果資料再次入資料棧 }catch(Exception e){ //System.out.println("多項式不正確1"+str+" "+c); e.printStackTrace(); } } } }else if(c==')')//右括號就返回找棧頂元素,右括號是不進棧的 { while(true) { char theop=(char)op.pop(); if(theop=='(') { break; } else { try{ int odnum1=(int)od.pop(); int odnum2=(int)od.pop(); //System.out.println(" "+odnum1+" "+odnum2); //System.out.println(cacuResult(theop,odnum2,odnum1)+"-------進棧"); od.push(cacuResult(theop,odnum2,odnum1));//運算括號內的內容 }catch(Exception e) { //System.out.println("多項式不正確2"+str); e.printStackTrace(); } } } }else if(c>='0' && c<='9') { int tempindex=index+1; while(tempindex<length) { char tempc=str.charAt(tempindex);//取字串中處於當前字元的下一位 if(tempc>='0' && tempc<='9') { tempindex++;//若為數字則繼續向後取 } else { break;//證明數字取完 } } String odstr=str.substring(index,tempindex);//擷取這個字串則為兩個符號之間的數字 //System.out.println("---------"+odstr+"------------"); try{ int odnum=Integer.parseInt(odstr);//將數字轉化成整型便於運算 //System.out.println(odnum+"-------進棧"); od.push(odnum); index=tempindex-1; }catch(Exception e) { //System.out.println("多項式不正確3"+str); e.printStackTrace(); } } index++; } //檢查op棧是否為空 while(true) { Object obj=null; if(op.isEmpty()==false) { obj=op.pop(); } if(obj==null) { break;//為空證明運算已結束 } else//不為空就出棧運算 { char optemp=(char)obj; int odnum1=(int)od.pop(); int odnum2=(int)od.pop(); // System.out.println(cacuResult(optemp,odnum2,odnum1)+"-------進棧"); od.push(cacuResult(optemp,odnum2,odnum1)); } } int result=0; try{ result=(int)od.pop(); }catch(Exception e) { //System.out.println("多項式不正確4"+str); e.printStackTrace(); } System.out.println(result); } //計算加減乘除餘 public static int cacuResult(char op,int od1,int od2) { switch(op) { case '+':return od1+od2; case '-':return od1-od2; case '*':return od1*od2; case '/':return od1/od2; } return 0; } //返回符號優先順序 public static int getOplevel(char op) { switch(op) { case '(':return 0; case '+': case '-':return 1; case '*': case '/':return 2; default:return 0; } } }
4 結束語
分享和幫助是人生一大樂事,希望可以幫助您。本人才疏學淺,如果有不當之處,還請批評指正。同時歡迎大家評論、點贊及轉發!