private void Calcular() { PilhaLista <double> pilhaValores = new PilhaLista <double>(); //pilha que armazena valores da expressão do { char simbolo = seqPosfixa.Retirar(); //retira-se um simbolo da sequência posfixa if (simbolo >= 'A' && simbolo <= 'Z') //se o símbolo for uma letra { double valor = valores[simbolo - 'A']; //recupera valor referente à letra indexando o vetor valores pilhaValores.Empilhar(valor); //empilha valor recebido } else // se for operador { double valor = 0; double operando2 = 0; double operando1 = 0; if (pilhaValores.Tamanho() < 2) { erro = true; //não há elementos suficientes para desempilhar os operandos, ou seja, o usuário digitou operadores 'sobrando' txtResultado.Text = "Erro: operadores a mais"; } else { operando2 = pilhaValores.Desempilhar(); //o segundo operando é referente ao topo da pilha, e é desempilhado operando1 = pilhaValores.Desempilhar(); //desempilha-se primeiro operando } switch (simbolo) //switch para realizar diferentes operações dependendo do operador { case '*': valor = operando1 * operando2; break; case '/': if (operando2 == 0) // na divisão, não se pode ter divisor 0 { txtResultado.Text = "Erro: Divisão por 0"; erro = true; } else { valor = operando1 / operando2; } break; case '^': valor = Math.Pow(operando1, operando2); break; case '+': valor = operando1 + operando2; break; case '-': valor = operando1 - operando2; break; } pilhaValores.Empilhar(valor); //empilha-se valor da sub-expressão realizada } }while (!seqPosfixa.EstaVazia() && !erro); // continua caso não tenha acabado a sequencia e não tenha havido erro if (!erro) //se não tiver dado erro { double resultado = pilhaValores.Desempilhar(); //como os resultados das sub-expressões vão sendo armazenados na pilha, ao final restará o resultado txtResultado.Text = resultado.ToString(); //exibe resultado } }