예제 #1
0
        public string Resolver(string expressaoPos)
        {
            //Declaração da pilha que guardará o resultado
            PilhaHerdaLista <string> pilhaResult = new PilhaHerdaLista <string>();

            for (int indice = 0; indice < qtd; indice++)
            {
                //Se é sinal, resolvemos uma parte da expressao, atualizando a pilha
                if (SeEhSinal(vetorPosfixo[indice] + ""))
                {
                    string sinal = vetorPosfixo[indice];
                    double b     = double.Parse(pilhaResult.Desempilhar());

                    if (sinal != "@")
                    {
                        double a = double.Parse(pilhaResult.Desempilhar());
                        pilhaResult.Empilhar(SubExpressao(a, b, Convert.ToChar(sinal)));
                    }
                    else
                    {
                        if (sinal == "@")
                        {
                            double result = -b;
                            pilhaResult.Empilhar(result + "");
                        }
                    }
                }
                else
                {
                    //Caso seja um número, apenas a adicionamos na pilhaResult
                    pilhaResult.Empilhar(vetorPosfixo[indice]);
                }
            }
            return(pilhaResult.Desempilhar());
        }
예제 #2
0
        public bool VerificarParenteses(string expressao)                         //Método bool que verifica se os parenteses de uma sequencia estão ordenados
        {
            PilhaHerdaLista <string> parenteses = new PilhaHerdaLista <string>(); //instanciação da pilha parenteses, que, como o nome informa, nunca guardará algo que não seja abre ou fecha parenteses

            foreach (var a in expressao)                                          //Percorre caractere por caractere da string passada por parâmetro
            {
                if (a == '(')                                                     //Verifica se o caractere atual é um abre parenteses; se não for, lemos o próximo caractere
                {
                    parenteses.Empilhar(a + "");                                  //Empilhamos o abre parenteses sempre que o achamos
                }
                else if (a == ')')                                                //Verifica se o caractere atual é um fecha parenteses; se não for, lemos o próximo caractere
                {
                    try
                    {
                        parenteses.Desempilhar(); //Caso consiga desempilhar, significa que a pilha não está vazia, logo sabemos que tem um abre parenteses referente ao fecha parenteses lido nessa posiçao da string, portanto está em ordem, e continuamos a percorre-la
                    }
                    catch (Exception)             //Se tentarmos desempilhar algo de uma pilha vazia, uma exceção é lançada
                    {
                        return(false);            //Caso não consiga desempilhar um fecha parenteses referente à um abre parenteses, a sequencia não está ordenada, portanto retornamos false
                    }
                }
            }
            if (!parenteses.EstaVazia()) //Se a pilha parenteses não estiver vazia, então a sequencia fornecida por parametro tem mais fecha parenteses do que abre parenteses, portanto não está ordenada
            {
                return(false);           //Retornamos false se a sequencia não está ordenada
            }
            return(true);                //Retornamos true se a sequencia está ordenada
        }
예제 #3
0
        public static bool EstaBalanceada(String entrada)   // Método que verifica se a expressão está balanceada
        {
            // construtor com tamanho default; topo valerá -1
            PilhaHerdaLista <char> p = new PilhaHerdaLista <char>();
            bool balanceada          = true;
            int  indice = 0;
            char simbolo;
            char caracterAbertura;

            for (indice = 0; balanceada && indice < entrada.Length; indice++)
            {
                simbolo = entrada[indice];
                if (simbolo == '(')
                {
                    p.Empilhar(simbolo); // chamada causa overhead
                }
                else
                if (simbolo == ')')
                {
                    if (p.EstaVazia())
                    {
                        balanceada = false; // pois a pilha já esvaziou
                    }
                    else
                    {
                        caracterAbertura = p.Desempilhar();
                        if (!Combinam(simbolo, caracterAbertura))
                        {
                            balanceada = false;
                        }
                    }
                }
            }
            if (!p.EstaVazia())
            {
                balanceada = false;
            }
            return(balanceada);
        }
예제 #4
0
        public string ParaPosfixa(string expressaoInfixa)
        {
            string posfixa = "";
            int    a       = 0;

            if (expressaoInfixa[0] == '-')
            {
                posfixa += "s";
            }

            char letra = 'A';

            //Para construimos a sequencia posfixa e popularmos seu vetor(que será usado no método Resolver()), fazemos um loop que percorre cada posição do vetInfixo
            for (int indice = a; indice < qtd; indice++)
            {
                if (SeEhSinal(vetInfixo[indice])) //Caso o valor lido seja sinal, verificamos sua preferencia
                {
                    if (indice != 0 || vetInfixo[indice] == "(")
                    {
                        if (vetInfixo[indice] == ")")
                        {
                            while (pilha.OTopo() != "(")
                            {
                                var aux = pilha.Desempilhar();
                                posfixa        += aux;
                                vetorPosfixo[a] = aux;
                                a++;
                            }
                            pilha.Desempilhar();
                        }
                        else
                        {
                            while (!pilha.EstaVazia() && SeTemPreferencia(pilha.OTopo(), vetInfixo[indice]))
                            {
                                var aux = pilha.Desempilhar();
                                if (vetInfixo[indice] != "(")
                                {
                                    posfixa        += aux;
                                    vetorPosfixo[a] = aux;
                                    a++;
                                }
                            }
                            pilha.Empilhar(vetInfixo[indice]);
                        }
                    }
                }
                else
                {
                    if (posfixa != "" && indice == 1)
                    {
                        posfixa           = letra + "-";
                        vetorPosfixo[a]   = vetInfixo[indice];
                        vetorPosfixo[++a] = "@";
                        letra++;
                        a++;
                    }
                    else
                    {
                        posfixa += letra;
                        letra++;
                        vetorPosfixo[a] = vetInfixo[indice];
                        a++;
                    }
                }
            }

            //Caso a pilha de sinais não esteja vazia, temos que esvazia-la na sequencia correta
            for (int l = qtd; !pilha.EstaVazia(); l++)
            {
                var aux = pilha.Desempilhar();
                if (aux != "(")
                {
                    posfixa        += aux;
                    vetorPosfixo[a] = aux;
                    a++;
                }
            }
            qtd = qtd - qtdParenteses; //Diminuimos 2 na variavel qtd porque os dois parenteses lidos não foram adicionados no vetorPosfixo, que será usado no método Resolver(), portanto deve estar com sua qtd atualizada

            return(posfixa);           //Retornamos a sequencia posfixa encontrada
        }