/// <summary> /// Transforma a string infixa em pósfixa /// </summary> public void TransformarEmPosfixa() { posfixa = ""; char maiorPrecedencia = ' '; //indica o operador com a maior precedência(que deve ser priorizado) operadores = new PilhaListaHerdada <char>(); //instancia a pilha que contém os operadores da expressão for (int i = 0; i < infixa.Length; i++) { if (infixa[i] != '(' && infixa[i] != ')' && !EhOperador(infixa[i])) { //Significa que infixa[i] é um valor, portanto é só adicioná-lo posfixa += infixa[i]; } else { bool ehParenteses = infixa[i] == '('; //Variável booleana que indica se é parenteses(e o que vem depois deve ser priorizado) while (!ehParenteses && !operadores.EstaVazia() && haPrecedencia(operadores.OTopo(), infixa[i])) { maiorPrecedencia = operadores.Desempilhar(); if (maiorPrecedencia != '(') { posfixa += maiorPrecedencia; } else { ehParenteses = true; } } if (infixa[i] != ')') { operadores.Empilhar(infixa[i]); } else if (!operadores.EstaVazia()) { posfixa += operadores.Desempilhar(); } } } while (!operadores.EstaVazia()) { maiorPrecedencia = operadores.Desempilhar(); if (maiorPrecedencia != '(') { posfixa += maiorPrecedencia; } } }
public double CalcularResultado() { PilhaListaHerdada <double> pilha = new PilhaListaHerdada <double>(); for (int i = 0; i < posfixa.Length; i++) { if (!EhOperador(posfixa[i])) { pilha.Empilhar(valores[posfixa[i] - 'A']); } else { double operando1 = pilha.Desempilhar(); double operando2 = pilha.Desempilhar(); pilha.Empilhar(CalcularExpressao(posfixa[i], operando2, operando1)); } } return(pilha.Desempilhar()); }