【每日藍橋】6、一三年省賽JavaC組真題“逆波蘭表達式”

你好呀,我是灰小猿,一個超會寫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]};		//返回處理結果
	}

}

 

輸出樣例:

其中有不足或者改進的地方,還希望小夥伴留言提出,一起學習!

感興趣的小夥伴可以關注專欄!

灰小猿陪你一起進步!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章