예제 #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
 int qtd = 0;                                       //Variável que guarda a quantidade de valores que são guardados no vetor infixo. Não pode ser local, pois usamos seu valor em quase todos os métodos, já que os vetores usados têm um tamanho de 26 posições.
 public Expressao()                                 //Construtor padrão da classe Expressao
 {
     vetInfixo    = new string[26];                 //Instanciação do vetor infixo
     vetorPosfixo = new string[26];                 //Instanciação do vetor infixo
     pilha        = new PilhaHerdaLista <string>(); //Instanciação da pilha
 }