Dúvida exercício Java (operações matemáticas na notação pós-fixada)

7 respostas
java
M

Crie um programa em Java que permita realizar operações matemáticas na notação pós-fixada, com o auxílio de pilhas para realizar estas operações.

A seguinte expressão: (1-2) * (4+5)

na notação pós-fixada é igual a: 1 2 - 4 5 + *

Para realizar o cálculo, cada operando é empilhado em uma pilha de valores. Quando se encontra um operador, desempilha0se o número apropriado de operandos, realizando-se a operação devida e empilha0se o resultado.

Desse modo, na expressão citada, são empilhados os valores 1 e 2.

Quando aparece o operador -, 1 e 2 são desempilhados, e o resultado da operação, no caso -1 = (1-2), é colocado no topo da pilha.
A seguir, 4 e 5 são empilhados. O operador seguinte, +, desempilha o 4 e o 5 e empilha o resultado da soma = 9.

Nesse momento estão na pilha os dois resultados parciais, -1 na base e 9 no topo. O operador *, então, desempilha os dois e coloca -9 (= -1 * 9) no topo da pilha

O que já fiz…
`public class CalculoMatematico {

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);

	String input = scanner.nextLine();
	StringBuffer numBuffer = new StringBuffer();

	Stack<Float> stack = new Stack<>();
	List<String> operadores = new ArrayList<String>();

	System.out.println("input:" + input);
	System.out.println("numBuffer: " + numBuffer);


	for (int i = 0; i < input.length(); i++) {
		char c = input.charAt(i);
		System.out.println("c: " + c);

		if (Character.isDigit(c) || c == ',' || c == '.') {
			numBuffer.append(c);
			System.out.println("numBuffer: " + numBuffer);
		} else {
			if (numBuffer.length() > 0) {
				try {
					float numero = Float.parseFloat(numBuffer.toString());
					System.out.println("numero: " + numero);
					stack.push(numero);
				} catch (NumberFormatException nfe) {
					System.out.println("ERRO de sintaxe!");
					return;
				} finally {
					numBuffer = new StringBuffer();
				}
			}
			if (c == '/' || c == '*' || c == '-' || c == '+') {					
				String recebeOperador = String.valueOf(c);
				operadores.add(recebeOperador);
			}
		}
	}
	System.out.println("Numeros na pilha: " + stack);
	System.out.println("Operadores: " + operadores);		
	scanner.close();
}

}`

Não sei como fazer o passo de fazer o cálculo e desempilhar… Alguém me ajuda?

7 Respostas

D

Olá

Para desempilhar a pilha

Enquanto operadores não estiver vazia faça
    operador = operadores.pop();
    valorDaDireita = stack.pop();
    valorDaEsquerda = stack.pop();
    resultado = calcular( valorDaEsquerda , operador , valorDaDireita );
    stack.push(resultado);
resultadoDaExpressao = stack.pop();

o calcular é fácil, exemplo de soma

Se operador igual "+" então
    retorna valorDaEsquerda + valorDaDireita;
M

Diego,

Não entendi na questão abaixo:

Enquanto operadores não estiver vazia faça operador = operadores.pop(); valorDaDireita = stack.pop(); valorDaEsquerda = stack.pop(); resultado = calcular( valorDaEsquerda , operador , valorDaDireita ); stack.push(resultado); resultadoDaExpressao = stack.pop();

Em qual momento ele vai desempilhar na ordem? Essa é a minha dúvida, pois o pop() sempre pega o ultimo correto? E devo usar essa lógica após preencher toda a pilha?

D

.peek() retorna o elemento que está no topo sem remover
.pop() remove o elemento que está no topo retornando o elemento removido
.push(item) adiciona um elemento no topo

Se não me engano, ambos os métodos estão presentes nas classes list e stack, se não estiver, use o list.remove(list.size() - 1) ou stack.remove(stack.size() - 1)

Deve ser usado antes do scanner.close() no código que vc postou, depois que as pilhas forem preenchidas, vc usou list para os operadores mas acho melhor usar stack

O último elemento que ficar na pilha, será o resultado da expressão.

H

Marquinmpfs

Você conseguiu resolver a questão, como ficou o código?

M

Cara, não consegui… Vou colocar o código atual…

M

public class CalculoMatematico {

static String calculoResultado;
static Float recebeValorDireita;
static Float recebeValorEsquerda;

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);

	String operador;
	Float valorDaDireita;
	Float valorDaEsquerda;

	char c = '\u0000';

	String input = scanner.nextLine();
	StringBuffer numBuffer = new StringBuffer();

	Stack<Float> stack = new Stack<>();
	List<String> operadores = new ArrayList<String>();

	System.out.println("input:" + input);
	System.out.println("numBuffer: " + numBuffer);

	for (int i = 0; i < input.length(); i++) {
		c = input.charAt(i);
		System.out.println("c: " + c);

		if (Character.isDigit(c) || c == ',' || c == '.') {
			numBuffer.append(c);
			System.out.println("numBuffer: " + numBuffer);
		} else {
			if (numBuffer.length() > 0) {
				try {
					float numero = Float.parseFloat(numBuffer.toString());
					System.out.println("numero: " + numero);
					stack.push(numero);
				} catch (NumberFormatException nfe) {
					System.out.println("ERRO de sintaxe!");
					return;
				} finally {
					numBuffer = new StringBuffer();
				}
			}
			if (c == '/' || c == '*' || c == '-' || c == '+') {
				String recebeOperador = String.valueOf(c);
				stack.push(Float.parseFloat(recebeOperador));
				operadores.add(recebeOperador);
			}
		}
	}
	System.out.println("Notação pós-fixada é igual a: " + stack);
	
	calculoResultado = operador = operadores.remove(operadores.size() - 1);
	System.out.println("Operador: " + calculoResultado);

	if (stack != null) {
		recebeValorDireita = valorDaDireita = stack.pop();
		System.out.println("Valor Direita: " + recebeValorDireita);
		recebeValorEsquerda = valorDaEsquerda = stack.pop();
		System.out.println("Valor Esquerda: " + recebeValorEsquerda);
	}
	Float resultado = calculo(recebeValorDireita, recebeValorEsquerda, calculoResultado);
	stack.push(resultado);
	System.out.println("Resultado:" + resultado);
	scanner.close();
}

public static float calculo(Float resultado1, Float resultado2, String operador) {

	if (calculoResultado.equals("/")) {
		return resultado1 / resultado2;
	} else if (calculoResultado.equals("*")) {
		return resultado1 * resultado2;
	} else if (calculoResultado.equals("-")) {
		return resultado1 - resultado2;
	} else if (calculoResultado.equals("+")) {
		return resultado1 + resultado2;
	} else {
		return 0;
	}
}

}

D
while (!operadores.isEmpty()) {
	String operador = operadores.pop(); // obtem o operador

	recebeValorDireita = valorDaDireita = stack.pop();
	System.out.println("Valor Direita: " + recebeValorDireita);

	recebeValorEsquerda = valorDaEsquerda = stack.pop();
	System.out.println("Valor Esquerda: " + recebeValorEsquerda);

	Float resultado = calculo(recebeValorEsquerda, recebeValorDireita, operador); // valorEsqurda deve ficar a esquerda, ValorDireita deve ficar a direita
	stack.push(resultado);
	System.out.println("Resultado:" + resultado);
}
    System.out.println("Resultado da expressão:" + stack.pop());
scanner.close();

public static float calculo(Float resultado1, Float resultado2, String operador) {

if (operador.equals("/")) { // operador
	return resultado1 / resultado2;
Criado 27 de maio de 2016
Ultima resposta 30 de mai. de 2016
Respostas 7
Participantes 3