[Daily Blue Bridge] 6. La verdadera cuestión de la "expresión polaca inversa" en el Grupo de Java en el XIII Concurso Provincial

Hola, soy el pequeño simio gris, ¡un programador que puede escribir errores!

Bienvenidos a todos para que presten atención a mi columna " Daily Blue Bridge ". La función principal de esta columna es compartir con ustedes las preguntas reales de las competiciones provinciales y finales de la Blue Bridge Cup en los últimos años, analizar las ideas de algoritmos, estructuras de datos y otros contenido que existe en él, y le ayudará a aprender a obtener más conocimientos y tecnología.

Título: Expresión polaca inversa

Las expresiones normales se llaman expresiones infijas, el operador está en el medio, que es principalmente para lectura humana, y no es conveniente resolverlo por máquina.

Por ejemplo: 3 + 5 * (2 + 6) -1

Y a menudo es necesario usar paréntesis en el orden de las operaciones en la tabla,

Por el contrario, si se usa la expresión polaca inversa (expresión de prefijo), la fórmula anterior es:

- + 3 * 5 + 2 6 1

Los corchetes ya no son necesarios y la máquina puede usar el método recursivo para resolverlo fácilmente

Por simplicidad, asumimos:

1. Solo + - * tres operadores

2. Cada operando es un número entero no negativo menor que 10

El siguiente programa evalúa una cadena de representación polaca inversa,

El valor de retorno es un dato: el primer elemento representa el resultado de la evaluación y el segundo elemento representa el número de caracteres que ha analizado.

 

static  int  [] evaluste (Stringx) {

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 =_________________________________; // completa los espacios en blanco

 

int  v = Entero. MAX_VALUE ;

si (c=='+')v =v1[0] +v2[0];

si (c=='*')v =v1[0] *v2[0];

si (c=='-')v =v1[0] -v2[0];

 

return  new  int [] { v, 1 +v1[1] +v2[1]};

}

 

Analice la lógica del código, adivine el código en el subrayado y envíelo a través de la web

Nota: Utilice únicamente el código que falta como respuesta, ¡no complete códigos, símbolos o texto explicativo adicionales! ! !

Ideas de resolución de problemas:

La clave para resolver este problema es leer el código fuente en la raíz, comprender las funciones específicas que se implementarán en cada línea y luego comprender la idea principal del diseño del programa y completar los espacios en blanco de acuerdo con los requisitos. en el tallo.

Para obtener una explicación específica del código fuente, consulte la respuesta a continuación.

Código fuente de respuesta:

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

}

 

Salida de muestra:

Hay deficiencias o mejoras, ¡y espero que mis amigos dejen un mensaje y aprendan juntos!

¡Los amigos interesados ​​pueden seguir la columna!

¡Little Grey Ape os acompaña para progresar juntos!

Finalmente, estoy participando en la selección del Blog Star 2020, ¡ayúdame a votar por él!

Enlace de voto: https://bss.csdn.net/m/topic/blog_star2020/detail?username=weixin_44985880

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44985880/article/details/112678377
Recomendado
Clasificación