你好呀,我是灰小猿,一個超會寫bug的程式猿!
歡迎大家關注我的專欄“每日藍橋”,該專欄的主要作用是和大家分享近幾年藍橋杯省賽及決賽等真題,決議其中存在的演算法思想、資料結構等內容,幫助大家學習到更多的知識和技術!
標題:逆波蘭運算式
正常的運算式稱為中綴運算式,運算子在中間,主要是給人閱讀的,機器求解并不方便
例如:3 + 5 *(2 + 6)- 1
而且常常需要使用括號來該表運算次序,
相反,如果使用逆波蘭運算式(前綴運算式)表示,上面的算式則為:
- + 3 * 5 + 2 6 1
不再需要括號,機器可以使用遞回的方法很方便的求解
為了簡便,我們假設:
1、只有 + - * 三種運算子
2、每一運算元都是一個小于10的非負整數
下面的程式對一個逆波蘭表示串進行求值,
其回傳值為一個資料:其中第一元素表示求值結果,第二元素表示它已決議的字符數
static int [] evaluste(String x) {
if (x.length()==0) {
return new int[] {0,0};
}
char c = x.charAt(0);
if (c>='0'&&c<='9') {
return new int[] {c-'0',1};
}
int[] v1 = evaluste(x.substring(1));
int[] v2 = _________________________________; //填空位置
int v = Integer.MAX_VALUE;
if(c=='+') v = v1[0] + v2[0];
if(c=='*') v = v1[0] * v2[0];
if(c=='-') v = v1[0] - v2[0];
return new int[] {v,1 + v1[1] + v2[1]};
}
請分析代碼邏輯,并推測劃線處的代碼,通過網頁提交
注意:僅把缺少的代碼作為答案,千萬不要填寫多余的代碼、符號或者說明文字!!!
解題思路:
本題在解題上的關鍵就是通讀題干中的原始碼,理解每一行所要實作的具體功能,之后了解該程式設計的主要思路,根據題干中的要求把空白處補全就可以了,
關于原始碼的具體解釋可以看下面的答案,
答案原始碼:
package 一三年省賽真題; public class Year2013_t6 { public static void main(String[] args) { //原式子:3+5*(2+6)-1=42 int a[] = evaluste("-+3*5+261"); System.out.println(a[0]); } /** * 逆波蘭運算式函式 * -+3*5+261 * @param x 傳入的逆波蘭運算式 * */ static int [] evaluste(String x) { //如果傳入的字串長度為0,說明該字串無效 if (x.length()==0) { return new int[] {0,0}; } char c = x.charAt(0); //獲取到字串的第一個字符 if (c>='0'&&c<='9') { //判斷該字符是不是數字 return new int[] {c-'0',1}; //如果是數字,回傳該數字和處理的字符數 } int[] v1 = evaluste(x.substring(1)); //如果第一個字符是運算子,截取后面的部分 int[] v2 = evaluste(x.substring(1+v1[1])); //填空位置 截取上一步沒有截取到的部分 int v = Integer.MAX_VALUE; //根據第一個字符的型別,對后面回傳的結果進行處理 if(c=='+') v = v1[0] + v2[0]; if(c=='*') v = v1[0] * v2[0]; if(c=='-') v = v1[0] - v2[0]; return new int[] {v,1 + v1[1] + v2[1]}; //回傳處理結果 } }
輸出樣例:
其中有不足或者改進的地方,還希望小伙伴留言提出,一起學習!
感興趣的小伙伴可以關注專欄!
灰小猿陪你一起進步!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/249520.html
標籤:其他

