[Blue Bridge Cup] Entrenamiento para el examen 2013 C ++ A Pregunta grupal 6 Expresión inversa en polaco

Expresión polaca inversa

Las expresiones normales se llaman expresiones infijas, el operador está en el medio, que es principalmente para que la gente lo lea, no es conveniente resolverlo por máquina.
Por ejemplo: 3 + 5 * (2 + 6) -1
Además, a menudo es necesario utilizar paréntesis para cambiar el orden de las operaciones.
Por el contrario, si se expresa mediante una expresión polaca inversa (expresión de prefijo), la fórmula anterior se expresa como:
- + 3 * 5 + 2 6 1
No se necesitan paréntesis y la máquina puede resolverlo fácilmente mediante el método recursivo.
Para simplificar, asumimos:
1. Hay solo tres operadores + - *
2. Cada operando es un entero no negativo menor que 10 El
siguiente programa evalúa una cadena de representación polaca inversa.
El valor de retorno es una matriz: el primer elemento representa el resultado de la evaluación y el segundo elemento representa el número de caracteres que ha analizado. Analice la lógica del código, adivine el código en el subrayado y envíelo a través de la página web.
Nota: ¡Utilice únicamente el código que falta como respuesta y no complete códigos, símbolos o texto explicativo adicionales! !

struct EV
{
int result; //计算结果 
int n; //消耗掉的字符数 
};

struct EV evaluate(char* x)
{
struct EV ev = {0,0};
struct EV v1;
struct EV v2;

if(*x==0) return ev;

if(x[0]>='0' && x[0]<='9'){
ev.result = x[0]-'0';
ev.n = 1;
return ev;
}

v1 = evaluate(x+1);
v2 = _________; //填空位置

if(x[0]=='+') ev.result = v1.result + v2.result;
if(x[0]=='*') ev.result = v1.result * v2.result;
if(x[0]=='-') ev.result = v1.result - v2.result;
ev.n = 1+v1.n+v2.n;

return ev;
}

 Respuesta: evaluar (x + v1.n + 1)

 

Análisis del problema

Supongo, considerando que las variables dadas en el título tienen variables no utilizadas, v1.n, los resultados dados en cada paso deben ser útiles, especialmente dada la variable de retorno recibida, entonces los siguientes pasos usan la variable Puede ser grande, puedes probar

#include <iostream>
using namespace std;

struct EV{
	int result; //计算结果 
	int n; //消耗掉的字符数 
};

struct EV evaluate(char* x)
{
	struct EV ev = {0,0};
	struct EV v1;
	struct EV v2;
	
	if(*x == 0) return ev;
	
	if(x[0]>='0' && x[0]<='9'){
		ev.result = x[0] - '0'; //字符转数字 
		ev.n = 1;
		return ev;
	}

	v1 = evaluate(x+1);
//	v2 = _________; //填空位置
	v2 = evaluate(x+v1.n+1);
	
	if(x[0]=='+') ev.result = v1.result + v2.result;
	if(x[0]=='*') ev.result = v1.result * v2.result;
	if(x[0]=='-') ev.result = v1.result - v2.result;
	ev.n = 1 + v1.n + v2.n;
	
	return ev;
}

int main(int argc, char** argv) {
	string str = "-+3*5+261";
	const EV &ev = evaluate((char*)(str.c_str()));
	cout << ev.result << endl;
	return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44566432/article/details/115139746
Recomendado
Clasificación