[デイリーブルーブリッジ] 6。第13回州大会のジャワグループにおける「逆ポーランド表現」の本当の問題

こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです!

私のコラム「DailyBlueBridge」に注目してください。このコラムの主な機能は、近年のBlue Bridge Cup州の大会や決勝戦の本当の質問を共有し、アルゴリズムのアイデア、データ構造などを分析することです。その中に存在し、あなたが学ぶのを助けるコンテンツより多くの知識と技術に!

タイトル:逆ポーランド記法

通常の式は中置式と呼ばれます。演算子は中央にあり、主に人間が読むためのものであり、機械で解くのは便利ではありません。

例:3 + 5 *(2 + 6)-1

また、多くの場合、テーブル内の操作の順序に括弧を使用する必要があります。

逆に、逆ポーランド式(プレフィックス式)を使用すると、上記の式は次のようになります。

-+ 3 * 5 + 2 6 1

ブラケットは不要になり、マシンは再帰的な方法を使用して簡単に解決できます

簡単にするために、次のように仮定します。

1. +-* 3つの演算子のみ

2.各オペランドは10未満の負でない整数です

次のプログラムは、逆ポーランド表現文字列を評価します。

戻り値はデータの一部です。最初の要素は評価結果を表し、2番目の要素は解析した文字数を表します。

 

static  int  [] evaluste(Stringx){

if  (x.length()== 0){

 新しい intを返す[] {0,0};

}

 

char  c =x.charAt(0);

if  (c> ='0'&&c<='9'){

 新しい intを返す[] { c-'0 '、1};

}

int []v1 = evalustex.substring(1));

int []v2 =_________________________________; //空欄に記入

 

int  v =整数。MAX_VALUE ;

ifc=='+'v =v1[0] +v2[0];

ifc=='*'v =v1[0] *v2[0];

ifc=='-'v =v1[0]-v2[0];

 

 新しい intを返す[] { v、1 +v1[1] +v2[1]};

}

 

コードロジックを分析し、下線でコードを推測して、Webから送信してください

注:不足しているコードのみを回答として使用し、余分なコード、記号、説明テキストは入力しないでください。

問題解決のアイデア:

この問題を解決するための鍵は、ステムのソースコードを読み、各行に実装される特定の機能を理解してから、プログラム設計の主なアイデアを理解し、要件に従って空白を埋めることです茎に。

ソースコードの具体的な説明については、以下の回答を参照してください。

回答のソースコード:

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]};		//返回处理结果
	}

}

 

サンプル出力:

欠点や改善点がありますので、友達にメッセージを残して一緒に学んでもらいたいです!

興味のある友達はコラムをフォローできます!

リトルグレイエイプは一緒に進歩するためにあなたに同行します!

最後に、2020 Blog Starの選考に参加しています。投票にご協力ください!

投票リンク:https //bss.csdn.net/m/topic/blog_star2020/detail?username = weixin_44985880

 

おすすめ

転載: blog.csdn.net/weixin_44985880/article/details/112678377