示例#1
0
        /// <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;
                }
            }
        }
示例#2
0
        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());
        }