為了可以出帶括號的題目,我學習了以往同學的作業。慶幸的是出題的要求只是出四個數進行運算就行,這樣就大大縮減了這個功能的難度。
只有一對括號出現可以有以下幾種情況:
1+1+1+1;
(1+1)+1+1;
(1+1+1)+1;
1+(1+1)+1;
1+(1+1+1);
1+1+(1+1);
所以在主類中編寫了swich(i),這裡的 i 是1-6的隨機數,將會在上述的六種情況中隨機挑選出一種。想利用這個中方法出帶括號的題目,把原式從String陣列型別改為String型別。
1 String zhongshi = ""; 2 int i = 0; 3 i = (int)(Math.random()*6)+1; 4 switch(i) 5 { 6 7 case 1: 8 zhongshi = "("+String.valueOf(y1)+sym1+String.valueOf(y2)+")"+sym2+String.valueOf(y3)+sym3+String.valueOf(y4); 9 break; 10 case 2: 11 zhongshi = "("+String.valueOf(y1)+sym1+String.valueOf(y2)+sym2+String.valueOf(y3)+")"+sym3+String.valueOf(y4); 12 break; 13 case 3: 14 zhongshi = String.valueOf(y1)+sym1+"("+String.valueOf(y2)+sym2+String.valueOf(y3)+")"+sym3+String.valueOf(y4); 15 break; 16 case 4: 17 zhongshi = String.valueOf(y1)+sym1+"("+String.valueOf(y2)+sym2+String.valueOf(y3)+sym3+String.valueOf(y4)+")"; 18 break; 19 case 5: 20 zhongshi = String.valueOf(y1)+sym1+String.valueOf(y2)+sym2+"("+String.valueOf(y3)+sym3+String.valueOf(y4)+")"; 21 break; 22 case 6: 23 zhongshi = String.valueOf(y1)+sym1+String.valueOf(y2)+sym2+String.valueOf(y3)+sym3+String.valueOf(y4); 24 25 }
為此,我將原來中綴遍歷的轉換字尾遍歷的函式toback形參型別換成了String,這樣的變化使得原來遍歷字串陣列的方法不能用了,於是在網上找到了String型別下substring(int a,int b)方法。這個可以實現這樣一種功能。從字串的第一位開始記數,第一位記零,substring(int a,int b)是從a開始(這裡a指的不是第幾位,而是下標序號,從零開始),到b之前截止(這裡的b也是指下標,而且不算b),擷取原字串。通過這個方法就可以遍歷字串的每個字元。最後通過獲取操作符棧的大小,FOR迴圈將每個字元相加得到字串型別的字尾表示式。
1 public String toback(String pre){ 2 3 String bottom = "#"; 4 5 Stack<String> OPTR = new Stack(); //運算子棧 6 Stack<String> OPND = new Stack(); //資料棧 7 8 OPTR.push(bottom); // 首先把結束標誌‘#’放入棧底 9 10 for(int k=0;k<pre.length();k++) 11 { 12 if(isNum(pre.substring(k,k+1))) // 遇到數直接寫入字尾表示式 13 { 14 OPND.push(pre.substring(k,k+1)); 15 } 16 else if(pre.substring(k,k+1).equals("(")) // 遇到“(”不用比較直接入棧 17 OPTR.push(pre.substring(k,k+1)); 18 else if(pre.substring(k,k+1).equals(")")) // 遇到右括號將其對應左括號後的操作符(操作符棧中的)全部寫入字尾表示式 19 { 20 while(!OPTR.peek().equals("(")) 21 { 22 OPND.push( OPTR.peek()); 23 OPTR.pop(); 24 } 25 OPTR.pop(); // 將“(”出棧,字尾表示式中不含小括號 26 } 27 else if (isoperator(pre.substring(k,k+1))) 28 { 29 while(!OPTR.empty() && priority(pre.substring(k,k+1)) <= priority(OPTR.peek())) 30 { 31 // 當前的操作符小於等於棧頂操作符的優先順序時,將棧頂操作符寫入到字尾表示式,重複此過程 32 OPND.push(OPTR.peek()); 33 OPTR.pop(); 34 } 35 OPTR.push(pre.substring(k,k+1));// 當前操作符棧為空或者當前操作符優先順序大於棧頂操作符的優先順序,將該操作符入棧 36 } 37 38 39 40 41 } 42 while(OPTR.peek() != "#") // 將所有的操作符加入字尾表示式 43 { 44 OPND.push(OPTR.peek()); 45 OPTR.pop(); 46 } 47 OPTR.pop(); 48 49 //利用操作符棧逆序即可得到字尾表示式 50 while(!OPND.empty()) 51 { 52 OPTR.push(OPND.peek()); 53 OPND.pop(); 54 } 55 //字尾表示式的的儲存陣列 56 String back = ""; 57 int j = OPTR.size(); 58 for(int i = 0; i<j;i++) 59 { 60 61 back+=OPTR.peek(); 62 OPTR.pop(); 63 64 } 65 //將String陣列轉換成字串 66 67 return back; 68 69 70 }
執行結果: