Esempio n. 1
0
        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
            }
        }