你好呀,我是灰小猿,一個超會寫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]}; //返回處理結果 } }
輸出樣例:
其中有不足或者改進的地方,還希望小夥伴留言提出,一起學習!
感興趣的小夥伴可以關注專欄!
灰小猿陪你一起進步!