Esempio n. 1
0
        // MÉTODO PARA CALCULAR A EXPRESSÃO PÓSFIXA
        private static void CalcularPosfixa(string expPosfixa, ref double result)
        {
            result = 0;                                                   // resultado do cálculo pófixo
            int posExpPosFixa = 0;                                        // posição na expressão pósfixa
            PilhaLista <double> pilhaValores = new PilhaLista <double>(); // para empilhar os valores

            while (posExpPosFixa < expPosfixa.Length)
            {
                char c = Convert.ToChar(expPosfixa.Substring(posExpPosFixa, 1)); // caracter lido

                if (!IsOperador(c))                                              // não é operador
                {
                    pilhaValores.Empilhar(vetValores[c - 'A']);                  // empilha o valor double

                    if (expPosfixa.Length == 1)
                    {
                        result = vetValores[c - 'A'];
                    }
                }
                else
                {
                    if (c == '√')
                    {
                        result = ResolverOperacao(0, pilhaValores.Desempilhar(), c); // "√" é operador unário
                    }
                    else
                    {
                        result = ResolverOperacao(pilhaValores.Desempilhar(), pilhaValores.Desempilhar(), c); // resolve a operação
                    }
                    pilhaValores.Empilhar(result);                                                            // // empilha o resultado
                }
                posExpPosFixa++;
            }
        }
Esempio n. 2
0
        /**
         * Método recursivo que retorna todos os caminhos entre as cidades que possuem o Id equivalentes aos parâmetros.
         * Cada passo do caminho em questão é armazenado na pilhaDeMovimentos de movimentos "pilhaMovimento".
         * Por fim, se chegou ao destino, a pilhaDeMovimentos é armazenada na variável "caminhosEncontrados", representando um dos caminhos possíveis
         * O método acaba quando todos os caminhos possíveis são percorridos.
         */
        public List <Caminho> BuscarCaminhos(int idCidadeOrigem, int idCidadeDestino)
        {
            for (int i = 0; i < QtdCidades; i++)
            {
                if ((MatrizAdjacencia[idCidadeOrigem, i] != null) && (!jaPassou[i]))
                {
                    pilhaMovimento.Empilhar(new Movimento(idCidadeOrigem, i));
                    jaPassou[i] = true;

                    if (i == idCidadeDestino) // se chegou ao destino
                    {
                        Caminho novoCaminho = new Caminho();
                        novoCaminho.Movimentos = pilhaMovimento.Clone();
                        caminhosEncontrados.Add(novoCaminho);
                        pilhaMovimento.Desempilhar(); // busca novos caminhos
                        jaPassou[i] = false;
                    }
                    else
                    {
                        BuscarCaminhos(i, idCidadeDestino); // backtracking
                    }
                }
            }

            if (!pilhaMovimento.EstaVazia)
            {
                pilhaMovimento.Desempilhar();
                jaPassou[idCidadeOrigem] = false;
            }
            return(caminhosEncontrados);
        }
Esempio n. 3
0
        private void ConverterParaPosfixa(FilaLista <char> seqInfixa, ref string posfixa)
        {
            char operadorComMaiorPrecedencia;
            PilhaLista <char> pilha = new PilhaLista <char>(); //pilha que será usada para empilhar operadores

            do
            {
                char simboloLido = seqInfixa.Retirar();          //simbolo lido é retirado da fila de sequencia infixa
                if (!(simboloLido <= 'Z' && simboloLido >= 'A')) //se o simbolo lido não estiver entre A e Z, ou seja, for um operador
                {
                    if (pilha.EstaVazia())                       //se a pilha estiver vazia, empilha-se simbolo lido
                    {
                        pilha.Empilhar(simboloLido);
                    }
                    else //se não estiver vazia
                    {
                        while (!pilha.EstaVazia() && DeveDesempilhar(pilha.OTopo(), simboloLido)) //enquanto a pilha não estiver vazia e deve desempilhar, ou seja, o topo da pilha tem precedencia sobre o simbolo lido
                        {
                            operadorComMaiorPrecedencia = pilha.Desempilhar();      //armazena-se operador com maior precedencia, tirando-o do topo
                            if (operadorComMaiorPrecedencia != '(')                 //caso não seja '(', pois não se coloca parêntesis em sequências posfixas
                            {
                                seqPosfixa.Enfileirar(operadorComMaiorPrecedencia); //enfileira-se na seqPosfixa
                                posfixa += operadorComMaiorPrecedencia;             //concatena-se na string de posfixa
                            }
                        }
                        if (simboloLido != ')') // empilha-se o simbolo lido, a menos que ele seja um ')'
                        {
                            pilha.Empilhar(simboloLido);
                        }
                        else
                        {
                            if (!pilha.EstaVazia() && pilha.OTopo() == '(') //se o simbolo lido for ')' e já foi feito o método acima sobre as precedencias, restará um parentesis aberto no topo da pilha, a menos que a sequência não esteja balanceada
                            {
                                operadorComMaiorPrecedencia = pilha.Desempilhar();
                            }
                            else
                            {
                                erro = true;
                            }
                        }
                    }
                }
                else // se for letra
                {
                    seqPosfixa.Enfileirar(simboloLido); //enfileira-se letra na sequência
                    posfixa += simboloLido;                             //concatena-se a letra na string posfixa
                }
            }while (!seqInfixa.EstaVazia() && !erro);                   //enquando não estiver vazia e não houver nenhum erro, continua-se a expressão

            while (!pilha.EstaVazia() && !erro)                         // se a fila de sequência ja estiver acabado mas houver operandos na pilha e não tiver dado erro
            {
                operadorComMaiorPrecedencia = pilha.Desempilhar();      //desempilha-se elemento da pilha
                if (operadorComMaiorPrecedencia != '(')                 //se não for '('
                {
                    seqPosfixa.Enfileirar(operadorComMaiorPrecedencia); //enfileira elemento
                    posfixa += operadorComMaiorPrecedencia;             //concatena à string posfixa
                }
            }
        }
Esempio n. 4
0
        private void Converter(string inf)
        {
            string elemento = "";
            string op       = "";

            for (int i = 0; i < inf.Length; i++) //Passa por todos os itens da sequencia infixa
            {
                elemento = "";
                if (!ops.Contains(inf[i])) //Se o item lido não for um operador
                {
                    elemento = "";
                    int inicial = i;                                                                                                                                      //index do início do numero
                    while (inicial + elemento.Length < inf.Length && (!ops.Contains(inf[inicial + elemento.Length].ToString()) || inf[inicial + elemento.Length] == '.')) //Enquanto o elemento ainda for um número
                    {
                        elemento += inf[inicial + elemento.Length];                                                                                                       //O número é incrementado
                    }
                    i = inicial + elemento.Length - 1;                                                                                                                    //o for continua a partir de onde a leitura parou
                    posfixa.Enfileirar(elemento);                                                                                                                         //O número é adicionado na fila posfixa
                }
                else //Se o item lido for um operador
                {
                    elemento = inf[i].ToString();                                                                     //O elemento recebe o item lido
                    while (!pilOps.EstaVazia() && Precedencia(pilOps.OTopo()) >= Precedencia(elemento[0].ToString())) //Enquanto o primeiro operador da pilha tiver precedência sobre os outros
                    {
                        op = pilOps.OTopo();                                                                          //Identifica o operador a ser tratado
                        if (op == "(")
                        {
                            break;
                        }
                        posfixa.Enfileirar(op.ToString()); //O operador é adicionado na sequencia posfixa
                        pilOps.Desempilhar();              //E removido da pilha
                    }
                    if (elemento == ")")                   //Se o operador for o fecha parênteses
                    {
                        pilOps.Desempilhar();              //Desempilha o ultimo operador
                    }
                    else //Se não
                    {
                        pilOps.Empilhar(elemento); //Empilha o operador normalmente
                    }
                }
                if (elemento != "(" && elemento != ")") //Verifica se o item não é ( nem ), pois esses não entram na sequência
                {
                    infixa.Enfileirar(elemento);        //Adiciona o item na infixa
                }
            }
            while (!pilOps.EstaVazia())     //Até a pilha ficar vazia
            {
                op = pilOps.Desempilhar();  //Desempilha o operador
                if (op != "(" && op != ")") //Verifica se o item não é ( nem ), pois esses não entram na sequência
                {
                    posfixa.Enfileirar(op); //Enfilera o operador na posfixa
                }
            }
        }
Esempio n. 5
0
        //private string ParaPosfixa(string infixa)
        //{
        //    string ret = "";
        //    char[] exp = infixa.ToCharArray();
        //    string ops = "()^*/+-";
        //    PilhaLista<char> seq = new PilhaLista<char>();
        //    //foreach (char c in exp)
        //    //{
        //    //    if (ops.Contains(c))
        //    //    {
        //    //        if (seq.EstaVazia())
        //    //            seq.Empilhar(c);
        //    //        else
        //    //        {
        //    //            if (MaiorPrecedencia(seq.OTopo(), c) == seq.OTopo())
        //    //            {
        //    //                if (c == ')')
        //    //                {
        //    //                    while (!seq.EstaVazia() && seq.OTopo() != '(')
        //    //                        ret += seq.Desempilhar();
        //    //                }
        //    //                else
        //    //                {
        //    //                    ret += seq.Desempilhar();
        //    //                    seq.Empilhar(c);
        //    //                }
        //    //            }
        //    //            else
        //    //                seq.Empilhar(c);
        //    //        }
        //    //    }
        //    //    else
        //    //        ret += c;
        //    //}
        //    for (int i=0; i<infixa.Length; i++)
        //    {
        //        char c = infixa[i];
        //        if (ops.Contains(c))
        //        {
        //            if (seq.EstaVazia())
        //            {
        //                seq.Empilhar(c);
        //            }
        //            else
        //            {
        //                if (MaiorPrecedencia(seq.OTopo(), c) == seq.OTopo())
        //                {
        //                    if (c == '+' || c == '-')
        //                    {
        //                        ret += seq.Desempilhar();
        //                        i--;
        //                    }
        //                    else
        //                    {
        //                        ret += seq.Desempilhar();
        //                        i--;
        //                    }
        //                }
        //                else
        //                {
        //                    if (c == '+' || c == '-')
        //                    {
        //                        ret += seq.Desempilhar();
        //                        seq.Empilhar(c);
        //                    }
        //                    else
        //                    {
        //                        seq.Empilhar(c);
        //                    }
        //                }
        //            }
        //        }
        //        else
        //        {
        //            ret += c;
        //        }
        //    }
        //    return ret;
        //}

        //public string ParaPosfixa(string inf)
        //{
        //    string ret = "";
        //    char[] exp = inf.ToCharArray();
        //    string ops = "()^*/+-";
        //    PilhaLista<string> pilOps = new PilhaLista<string>();

        //    for (int i = 0; i < inf.Length; i++)
        //    {
        //        string elemento = "";

        //        if (!ops.Contains(inf[i].ToString()))
        //        {
        //            elemento = "";
        //            int inicial = i;
        //            while (inicial + elemento.Length < inf.Length && (!ops.Contains(inf[inicial + elemento.Length].ToString()) || inf[inicial + elemento.Length] == '.'))
        //                elemento += inf[inicial + elemento.Length];
        //            i = inicial + elemento.Length - 1;
        //            //posfixa.Enfileirar(elemento);
        //        }
        //        else
        //        {
        //            if (inf[i] == '+' && (i == 0 || inf[i - 1] == '('))
        //                elemento = "#";
        //            else
        //            if (inf[i] == '-' && (i == 0 || inf[i - 1] == '('))
        //                elemento = "@";
        //            else
        //                elemento = inf[i] + "";

        //            while (!pilOps.EstaVazia() && Precedencia(pilOps.OTopo()[0] )> Precedencia (elemento[0]))
        //            {
        //                string op = pilOps.Desempilhar();
        //                /*if (op != "(" && op != ")")
        //                    posfixa.Enfileirar(op);*/
        //            }
        //            if (elemento != ")")
        //                pilOps.Empilhar(elemento);
        //        }
        //        if (elemento != "(" && elemento != ")")
        //            ret += elemento;
        //            //infixa.Enfileirar(elemento);
        //    }

        //    //TratarPilhaOperadores();
        //    while (!pilOps.EstaVazia())
        //    {
        //        string o = pilOps.Desempilhar();
        //        ret += o;
        //    }
        //    //sequenciaInfixa = EscreverSequencia(infixa);
        //    //sequenciaPosfixa = EscreverSequencia(posfixa);
        //    //resultado = CalcularResultado();
        //    //return resultado;
        //    return ret;
        //}

        private void Converter(string inf)
        {
            for (int i = 0; i < inf.Length; i++)
            {
                string elemento = "";
                if (ops.Contains(inf[i]))
                {
                    elemento = "";
                    int inicial = i;
                    while (inicial + elemento.Length < inf.Length && (!ops.Contains(inf[inicial + elemento.Length].ToString()) || inf[inicial + elemento.Length] == '.'))
                    {
                        elemento += inf[inicial + elemento.Length];
                    }
                    i = inicial + elemento.Length - 1;
                    posfixa.Enfileirar(elemento);
                }
                else
                {
                    elemento = inf[i].ToString();
                    while (!pilOps.EstaVazia() && Precedencia(pilOps.OTopo()) > Precedencia(elemento[0].ToString()))
                    {
                        char op = pilOps.OTopo()[0];
                        if (op == '(')
                        {
                            break;
                        }
                        posfixa.Enfileirar(op.ToString());
                        pilOps.Desempilhar();
                    }
                    if (elemento != ")")
                    {
                        pilOps.Empilhar(elemento);
                    }
                    else
                    {
                        pilOps.Desempilhar();
                    }
                }
                if (elemento != "(" && elemento != ")")
                {
                    infixa.Enfileirar(elemento);
                }
            }
            while (!pilOps.EstaVazia())
            {
                string op = pilOps.Desempilhar();
                if (op != "(" && op != ")")
                {
                    posfixa.Enfileirar(op);
                }
            }
        }
Esempio n. 6
0
        private double Calcular()
        {
            PilhaLista <double> valores = new PilhaLista <double>();
            double a = 0, b = 0, ret = 0;

            string[] vet = posfixa.ToArray();

            foreach (string s in vet)
            {
                if (!ops.Contains(s))
                {
                    valores.Empilhar(double.Parse(s.Replace('.', ',')));
                }
                else
                {
                    a = valores.Desempilhar();
                    b = valores.Desempilhar();
                    switch (s)
                    {
                    case "^":
                        ret = Math.Pow(b, a);
                        break;

                    case "*":
                        ret = a * b;
                        break;

                    case "/":
                        if (a == 0)
                        {
                            throw new DivideByZeroException("Divisão por 0");
                        }
                        ret = b / a;
                        break;

                    case "+":
                        ret = a + b;
                        break;

                    case "-":
                        ret = b - a;
                        break;

                    default:
                        break;
                    }
                    valores.Empilhar(ret);
                }
            }
            return(valores.Desempilhar());
        }
Esempio n. 7
0
        // MÉTODO PARA TRANSFORMAR A EXPRESSÃO INFIXA PARA PÓSFIXA
        private static void InfixaParaPosfixa(string expLetras, ref string expPosfixa)
        {
            PilhaLista <char> pilha = new PilhaLista <char>(); // para empilhar os operadores

            expPosfixa = "";                                   // expressão pósfixa com letras

            for (int posExp = 0; posExp < expLetras.Length; posExp++)
            {
                char c = Convert.ToChar(expLetras.Substring(posExp, 1)); // caracter lido

                if (!IsOperador(c))                                      // se não é operador, ou seja, é letra (valor)
                {
                    expPosfixa += c;                                     // adiciona na expressão
                }
                else
                {
                    if (pilha.EstaVazia() && c != ')')
                    {
                        pilha.Empilhar(c); // empilha o operador
                    }
                    else
                    {
                        if (c == ')')                              // se achamos um ")", existem operações prioritárias
                        {
                            while (pilha.OTopo() != '(')           // enquanto não acharmos o correspondente
                            {
                                expPosfixa += pilha.Desempilhar(); // desempilha os operadores priorizados
                            }
                            pilha.Desempilhar();                   // desempilha o próprio "("
                        }
                        else
                        {
                            while (Precedencia(pilha.OTopo(), c) && pilha.OTopo() != '(')
                            {
                                expPosfixa += pilha.Desempilhar();  // o topo tem precedência, então devem vir primeiro (desempilhando)
                                if (pilha.EstaVazia())
                                {
                                    break;
                                }
                            }
                            pilha.Empilhar(c); // empilha o novo caracter lido
                        }
                    }
                }
            }
            while (!pilha.EstaVazia())             // acabou a expressão, então se sobrou operadores
            {
                expPosfixa += pilha.Desempilhar(); // desempilhamos, já que está na ordem certa
            }
        }
Esempio n. 8
0
        private string paraPosfixa(string infixa)
        {
            string ret = "";

            char[]            exp = infixa.ToCharArray();
            string            ops = "()^*/+-";
            PilhaLista <char> seq = new PilhaLista <char>();

            foreach (char c in exp)
            {
                if (ops.Contains(c))
                {
                    if (seq.EstaVazia())
                    {
                        seq.Empilhar(c);
                    }
                    else
                    {
                        if (MaiorPrecedencia(seq.OTopo(), c) == seq.OTopo())
                        {
                            if (c == ')')
                            {
                                while (!seq.EstaVazia() && seq.OTopo() != '(')
                                {
                                    ret += seq.Desempilhar();
                                }
                            }
                            else
                            {
                                ret += seq.Desempilhar();
                                seq.Empilhar(c);
                            }
                        }
                        else
                        {
                            seq.Empilhar(c);
                        }
                    }
                }
                else
                {
                    ret += c;
                }
            }
            return(ret);
        }
Esempio n. 9
0
        private double CalcularResultado(FilaLista <string> expre)
        {
            PilhaLista <double> valores = new PilhaLista <double>();
            double v1 = 0, v2 = 0, result = 0;

            string[] vet = expre.ToArray();

            for (int c = 0; c < vet.Length; c++)                              //for até o fim do vetor
            {
                if (!IsOp(vet[c]))                                            //se não for operação
                {
                    valores.Empilhar(double.Parse(vet[c].Replace('.', ','))); //empilha e troca ponto por vírgula
                }
                else
                {
                    v1 = valores.Desempilhar();        //desempilha o 1º valor
                    v2 = valores.Desempilhar();        //desempilha o 2º valor

                    switch (vet[c])                    //switch do valor caso seja operção
                    {
                    case "+": result = v2 + v1; break; //se for + soma

                    case "-": result = v2 - v1; break; //se for - subtrai

                    case "*": result = v2 * v1; break; //se for * multiplica

                    case "/":                          //se for divisão
                        if (v1 == 0)
                        {
                            throw new DivideByZeroException("Divisão por 0"); //se for 0 joga exceção
                        }
                        result = v2 / v1; break;                              //se não for zero calcula

                    case "^": result = Math.Pow(v2, v1); break;               //se for ^ faz potência
                    }
                    valores.Empilhar(result);                                 //empilha o resultado
                }
            }

            return(valores.Desempilhar()); //no fim desempilha o resultado final
        }
Esempio n. 10
0
    public PilhaLista <Dado> Inverter()
    {
        PilhaLista <Dado> aux   = this;
        PilhaLista <Dado> outra = new PilhaLista <Dado>();

        while (!aux.EstaVazia())
        {
            outra.Empilhar(aux.Desempilhar());
        }

        return(outra);
    }
Esempio n. 11
0
        private double CalcularResultado(FilaLista <string> expre)
        {
            PilhaLista <double> valores = new PilhaLista <double>();
            double v1 = 0, v2 = 0, result = 0;

            string[] vet = expre.ToArray();

            for (int c = 0; c < vet.Length; c++)
            {
                if (!IsOp(vet[c]))
                {
                    valores.Empilhar(double.Parse(vet[c].Replace('.', ',')));
                }
                else
                {
                    v1 = valores.Desempilhar();
                    v2 = valores.Desempilhar();
                    switch (vet[c])
                    {
                    case "+": result = v2 + v1; break;

                    case "-": result = v2 - v1; break;

                    case "*": result = v2 * v1; break;

                    case "/":
                        if (v1 == 0)
                        {
                            throw new DivideByZeroException("Divisão por 0");
                        }
                        result = v2 / v1; break;

                    case "^": result = Math.Pow(v2, v1); break;
                    }
                    valores.Empilhar(result);
                }
            }

            return(valores.Desempilhar());
        }
Esempio n. 12
0
    public PilhaLista <Dado> Copia()
    {
        PilhaLista <Dado> s1 = new PilhaLista <Dado>();
        PilhaLista <Dado> s2 = new PilhaLista <Dado>();

        while (!this.EstaVazia())
        {
            s1.Empilhar(this.Desempilhar());
        }
        while (!s1.EstaVazia())
        {
            var obj = s1.Desempilhar();
            this.Empilhar(obj);
            s2.Empilhar(obj.Copia());
        }
        return(s2);
    }
Esempio n. 13
0
    public PilhaLista <Dado> Clone()
    {
        PilhaLista <Dado> aux = new PilhaLista <Dado>();

        while (!this.EstaVazia())
        {
            aux.Empilhar(this.Desempilhar());
        }
        PilhaLista <Dado> copia = new PilhaLista <Dado>();

        while (!aux.EstaVazia())
        {
            Dado d = aux.Desempilhar();
            this.Empilhar(d);
            copia.Empilhar(d);
        }
        return(copia);
    }
        private List <Caminho> SalvarResultados(int idCidadeOrigem, int idCidadeDestino)
        {
            int onde = idCidadeDestino;
            PilhaLista <Movimento> pilhaMovimentos = new PilhaLista <Movimento>();

            while (onde != idCidadeOrigem)
            {
                pilhaMovimentos.Empilhar(MatrizAdjacencia[vertices[percursos[onde].verticePai].Cidade.Id, vertices[onde].Cidade.Id]);
                onde = percursos[onde].verticePai;
            }

            if (pilhaMovimentos.Tamanho > 1)
            {
                PilhaLista <Movimento> pilhaMovimentosInvertido = new PilhaLista <Movimento>();
                for (int i = pilhaMovimentos.Tamanho - 1; !pilhaMovimentos.EstaVazia; i--) // exibe cada movimento do melhor caminho
                {
                    Movimento mov = pilhaMovimentos.Desempilhar();
                    pilhaMovimentosInvertido.Empilhar(mov);
                }
                caminhoEncontrado.Add(new Caminho(pilhaMovimentosInvertido));
            }

            return(caminhoEncontrado);
        }
Esempio n. 15
0
        // Acha todos os caminhos usando o algoritmo de backtracking de cada labirinto especificado...
        public void AcharCaminhos(ref DataGridView dgvLab, ref List <Posicao[]> caminhos, ref int[] qtdPosicoesEmCadaCaminho) //encontra os caminhos
        {
            Posicao posAtual = new Posicao(1, 1);                                                                             //nova posição no início do labirinto

            Posicao[] vetorPos = new Posicao[labirinto.Matriz.Length];
            qtdPosicoesEmCadaCaminho = new int[labirinto.Matriz.Length * 10]; //Garante que não há estouro
            caminhos = new List <Posicao[]>();
            Posicao proxPosicao = null;

            bool temCaminho;
            bool achouSaida = false;
            int  qtdPosicoes = 0, qtdCaminhos = 0;

            Pintar(ref dgvLab, posAtual.Linha, posAtual.Coluna);

            while (true)
            {
                while (true) //loop eterno
                {
                    proxPosicao = (Posicao)posAtual.Clone();


                    temCaminho = TemCaminho(ref posAtual, ref proxPosicao); //verifica se tem caminho

                    // Sinaliza no labirinto da classe Labirinto e no labirinto visual (dgvLab) para qual lugar prosseguiu
                    // o cursor depois de usar a Rosa dos Ventos (método TemCaminho()).
                    if (temCaminho)
                    {
                        proxPosicao.OndeParou = -1;
                        pilha.Empilhar(posAtual);
                        posAtual = (Posicao)proxPosicao.Clone();

                        // Verifica-se se o lugar para onde o cursor foi é a saída ou não.
                        if ((char)dgvLab[posAtual.Coluna, posAtual.Linha].Value != SAIDA)
                        {
                            dgvLab[posAtual.Coluna, posAtual.Linha].Value          = JA_PASSOU;
                            this.labirinto.Matriz[posAtual.Linha, posAtual.Coluna] = JA_PASSOU;
                            Pintar(ref dgvLab, posAtual.Linha, posAtual.Coluna);
                        }
                        else
                        {
                            Pintar(ref dgvLab, posAtual.Linha, posAtual.Coluna);
                            if (listaCaminhos.Count == 0)
                            {
                                System.Threading.Thread.Sleep(500);
                            }

                            achouSaida = true;
                            break;
                        }
                    }
                    // Volta a posição anterior - pois não há mais lugares para ir da posição atual, a não ser voltar!
                    else
                    {
                        if (pilha.EstaVazia)
                        {
                            Pintar(ref dgvLab, 1, 1);
                            break; //Não há caminhos
                        }

                        proxPosicao = (Posicao)pilha.OTopo().Clone();

                        dgvLab[posAtual.Coluna, posAtual.Linha].Value          = VAZIO;
                        this.labirinto.Matriz[posAtual.Linha, posAtual.Coluna] = VAZIO;
                        Pintar(ref dgvLab, proxPosicao.Linha, proxPosicao.Coluna);

                        posAtual = (Posicao)pilha.Desempilhar().Clone();
                    }
                }

                // Quando a saída, no labirinto: "S", é achada pelo algoritmo e o caminho feito para chegar até a saída
                // é adicionado a ArrayList de strings "listaCaminhos", que será usada posteriormente no método "MostrarCaminhos".
                if (achouSaida)
                {
                    string ret = "";
                    int    linhaAtual, colunaAtual;
                    PilhaLista <Posicao> pilhaClonada = pilha.Copia();
                    while (!pilhaClonada.EstaVazia)
                    {
                        linhaAtual  = pilhaClonada.OTopo().Linha;
                        colunaAtual = pilhaClonada.OTopo().Coluna;

                        Posicao posicaoAtual = new Posicao(linhaAtual, colunaAtual);
                        vetorPos[qtdPosicoes] = posicaoAtual;

                        ret += $"Linha: {linhaAtual}, Coluna: {colunaAtual}|";
                        pilhaClonada.Desempilhar();
                        qtdPosicoes++;
                    }
                    qtdPosicoesEmCadaCaminho[qtdCaminhos] = qtdPosicoes;
                    caminhos.Add(vetorPos);

                    listaCaminhos.Add(ret);

                    // Reseta-se todas as variáveis usadas para encontrarmos um caminho diferente do já encontrado!
                    qtdPosicoes = 0;
                    vetorPos    = new Posicao[labirinto.Matriz.Length];
                    achouSaida  = false;
                }
                else
                {
                    if (listaCaminhos.Count > 0)
                    {
                        break; //Encontrou todos os caminhos
                    }
                    else
                    {
                        listaCaminhos.Add("Não há caminhos");
                    }
                }

                if (pilha.EstaVazia)
                {
                    break;
                }

                posAtual = (Posicao)pilha.Desempilhar().Clone();
                qtdCaminhos++;
            }
        }
Esempio n. 16
0
        void Processar()
        {
            lsbBalanceado.Items.Clear();
            lsbOriginal.Items.Clear();

            bool houveErro     = false;
            int  numeroDoBloco = 0;
            var  pilha         = new PilhaLista <Palavra>();
            var  arquivo       = new StreamReader(dlgAbrir.FileName);

            while (!arquivo.EndOfStream && !houveErro)
            {
                string linha          = arquivo.ReadLine();
                string linhaDeSaida   = "";
                int    posicaoNaLinha = 0;
                while (posicaoNaLinha < linha.Length && !houveErro)
                {
                    string palavraLida = "";
                    char   caracter    = linha[posicaoNaLinha];
                    if (EhLetra(caracter)) // começou palavra, percorremos até terminar a palavra
                    {
                        int ondeComecouAPalavra = posicaoNaLinha;
                        while (posicaoNaLinha < linha.Length && EhLetra(linha[posicaoNaLinha]))
                        {
                            posicaoNaLinha++;
                        }
                        int quantosCaracteresTemAPalavra = posicaoNaLinha - ondeComecouAPalavra;
                        palavraLida = linha.Substring(ondeComecouAPalavra, quantosCaracteresTemAPalavra);
                        string palavraEmMaiusculo = palavraLida.ToUpper();
                        if (palavraEmMaiusculo.Equals("BEGIN") || // palavra abre bloco de comando?
                            palavraEmMaiusculo.Equals("CASE") ||
                            palavraEmMaiusculo.Equals("REPEAT"))
                        {
                            numeroDoBloco++;
                            pilha.Empilhar(new Palavra(palavraLida, numeroDoBloco));
                            linhaDeSaida += palavraLida + " {" + numeroDoBloco + "} ";
                        }
                        else // poderá ser palavra que encerra bloco de comandos
                        if (palavraEmMaiusculo.Equals("END") || // palavra abre bloco de comando?
                            palavraEmMaiusculo.Equals("UNTIL"))
                        {
                            var palavraDesempilhada = pilha.Desempilhar();
                            if (palavraEmMaiusculo.Equals("END"))
                            {
                                if (palavraDesempilhada.palavra.ToUpper().Equals("BEGIN") || // está correto
                                    palavraDesempilhada.palavra.ToUpper().Equals("CASE")
                                    )
                                {
                                    linhaDeSaida += palavraLida + " {" + palavraDesempilhada.numero + "} ";
                                }
                                else
                                {
                                    houveErro     = true;
                                    linhaDeSaida += "END sem o Begin ou Case correspondente.";
                                }
                            }
                            else
                            if (palavraEmMaiusculo.Equals("UNTIL"))
                            {
                                if (palavraDesempilhada.palavra.ToUpper().Equals("REPEAT")) // está correto
                                {
                                    linhaDeSaida += palavraLida + " {" + palavraDesempilhada.numero + "} ";
                                }
                                else
                                {
                                    houveErro     = true;
                                    linhaDeSaida += "UNTIL sem o Repeat correspondente.";
                                }
                            }
                        }
                        else
                        {
                            linhaDeSaida += palavraLida;
                        }
                    }
                    else
                    {
                        linhaDeSaida += caracter.ToString();
                        posicaoNaLinha++;
                    }
                } // while
                lsbOriginal.Items.Add(linha);
                lsbBalanceado.Items.Add(linhaDeSaida);
            }
            if (houveErro)
            {
                lsbBalanceado.Items.Add("Desbalanceado!");
            }
            if (!pilha.EstaVazia())
            {
                lsbBalanceado.Items.Add("Há begin, Case ou Repeat a mais.");
            }
            arquivo.Close();
        }
Esempio n. 17
0
        private void btnIgual_Click(object sender, EventArgs e)
        {
            FilaLista <string>  infixa  = new FilaLista <string>();
            FilaLista <string>  posfixa = new FilaLista <string>();
            PilhaLista <string> ops     = new PilhaLista <string>(); //declara e instancia as 3 listas
            string expressao            = txtVisor.Text;             //expressão a ser calculada

            for (int i = 0; i < expressao.Length; i++)               //for até o fim da expressão
            {
                string elemento = "";

                if (!IsOp(expressao[i].ToString())) //se não for uma operção
                {
                    elemento = "";
                    int inicial = i;
                    while (inicial + elemento.Length < expressao.Length && (!IsOp(expressao[inicial + elemento.Length].ToString()) || expressao[inicial + elemento.Length] == '.')) //enquanto não acabou a expressão, não for operação ou não for ponto
                    {
                        elemento += expressao[inicial + elemento.Length];                                                                                                           //incrementa o elemento com o valor da posição específic da expressão
                    }
                    i = inicial + elemento.Length - 1;
                    posfixa.Enfileirar(elemento); //enfileira na posfixa o elemento
                }
                else //se for operação
                {
                    elemento = expressao[i] + "";

                    while (!ops.EstaVazia() && TemPrecedencia(ops.OTopo()[0], elemento[0])) //enquanto não estiver vazia e tiver precedência
                    {
                        char op = ops.OTopo()[0];
                        if (op == '(')
                        {
                            break;
                        }
                        else //se não for abre parenteses
                        {
                            posfixa.Enfileirar(op + ""); //enfileira
                            ops.Desempilhar(); //desempilha
                        }
                    }

                    if (elemento != ")")        //se não for fecha parenteses
                    {
                        ops.Empilhar(elemento); //empilha
                    }
                    else //se for
                    {
                        ops.Desempilhar(); //desempilha
                    }
                }
                if (elemento != "(" && elemento != ")") //se não for parenteses
                {
                    infixa.Enfileirar(elemento);        //enfileira o elemento
                }
            }

            while (!ops.EstaVazia())           //enquanto não estiver vazia
            {
                string op = ops.Desempilhar(); //pega o primeiro da pilha

                if (op != "(" && op != ")")    //se não for parenteses
                {
                    posfixa.Enfileirar(op);    //enfileira
                }
            }

            escreverSeq(infixa, posfixa);                              //escreve na tela as sequências
            txtResultado.Text = CalcularResultado(posfixa).ToString(); //calcula e escreve o resultado
        }
Esempio n. 18
0
        private void btnIgual_Click(object sender, EventArgs e)
        {
            FilaLista <string>  infixa  = new FilaLista <string>();
            FilaLista <string>  posfixa = new FilaLista <string>();
            PilhaLista <string> ops     = new PilhaLista <string>();
            string expressao            = txtVisor.Text;

            for (int i = 0; i < expressao.Length; i++)
            {
                string elemento = "";

                if (!IsOp(expressao[i].ToString()))
                {
                    elemento = "";
                    int inicial = i;
                    while (inicial + elemento.Length < expressao.Length && (!IsOp(expressao[inicial + elemento.Length].ToString()) || expressao[inicial + elemento.Length] == '.'))
                    {
                        elemento += expressao[inicial + elemento.Length];
                    }
                    i = inicial + elemento.Length - 1;
                    posfixa.Enfileirar(elemento);
                }
                else
                {
                    elemento = expressao[i] + "";
                    while (!ops.EstaVazia() && TemPrecedencia(ops.OTopo()[0], elemento[0]))
                    {
                        char op = ops.OTopo()[0];
                        if (op == '(')
                        {
                            break;
                        }
                        else
                        {
                            posfixa.Enfileirar(op + "");
                            ops.Desempilhar();
                        }
                    }

                    if (elemento != ")")
                    {
                        ops.Empilhar(elemento);
                    }
                    else
                    {
                        ops.Desempilhar();
                    }
                }
                if (elemento != "(" && elemento != ")")
                {
                    infixa.Enfileirar(elemento);
                }
            }
            while (!ops.EstaVazia())
            {
                string op = ops.Desempilhar();
                if (op != "(" && op != ")")
                {
                    posfixa.Enfileirar(op);
                }
            }
            escreverSeq(infixa, posfixa);
            txtResultado.Text = CalcularResultado(posfixa).ToString();
        }
Esempio n. 19
0
    static void Main(string[] args)
    {
        const int maxCidade                 = 11;
        const int cidadeFinal               = 3;
        const int cidadeInicial             = 6;
        PilhaLista <Movimento> pilha        = new PilhaLista <Movimento>();
        List <int>             todosAndados = new List <int>();

        bool[] passouCidade = { false, false, false, false, false, false, false, false, false, false, false };

        int saidaAtual = 0;

        while (!(cidadeAtual == cidadeInicial && saidaAtual == maxCidade))
        {
            if (saidaAtual < maxCidade && cidadeAtual != cidadeFinal)
            {
                while (saidaAtual < maxCidade)
                {
                    if (passouCidade[saidaAtual] == false && cidades[cidadeAtual, saidaAtual] > -1)
                    {
                        break;
                    }

                    saidaAtual++;
                }

                if (saidaAtual != maxCidade)
                {
                    passouCidade[cidadeAtual] = true;
                    pilha.Empilhar(new Movimento(cidadeAtual, saidaAtual, cidades[cidadeAtual, saidaAtual]));
                    cidadeAtual = saidaAtual;
                    saidaAtual  = 0;
                }
            }
            else
            {
                if (cidadeAtual == cidadeFinal)
                {
                    PilhaLista <Movimento> inver = new PilhaLista <Movimento>();
                    inver.Empilhar(new Movimento(cidadeAtual, saidaAtual, 0));

                    while (!pilha.EstaVazia())
                    {
                        inver.Empilhar(pilha.Desempilhar());
                    }

                    int totalAndado = 0;

                    Write("Caminho encontrado: ");

                    while (!inver.EstaVazia())
                    {
                        Movimento mov = inver.Desempilhar();
                        totalAndado += mov.Valor;
                        Write(mov + "; ");
                        pilha.Empilhar(mov);
                    }

                    Write("Total andado: " + totalAndado);
                    WriteLine();

                    todosAndados.Add(totalAndado);
                    pilha.Desempilhar();
                }

                passouCidade[cidadeAtual] = false;
                Movimento m = pilha.Desempilhar();
                cidadeAtual = m.Cidade;
                saidaAtual  = m.Saida + 1;
            }
        }

        int menor = 0;
        int maior = 0;

        for (int i = 0; i < todosAndados.Count; i++)
        {
            if (todosAndados[i] < todosAndados[menor])
            {
                menor = i;
            }

            if (todosAndados[i] > todosAndados[maior])
            {
                maior = 1;
            }
        }

        WriteLine("Menor caminho: " + (menor + 1));
        WriteLine("Maior caminho: " + (maior + 1));

        ReadLine();
    }
Esempio n. 20
0
        public List <Caminho> BuscarCaminhos(int idCidadeOrigem, int idCidadeDestino)
        {
            int  idCidadeAtual, idSaidaAtual;
            bool achouCaminho = false, naoTemSaida = false;

            bool[] jaPassou = new bool[QtdCidades];

            for (int indice = 0; indice < QtdCidades; indice++)
            {
                jaPassou[indice] = false;
            }

            idCidadeAtual = idCidadeOrigem;
            idSaidaAtual  = 0;
            while (!naoTemSaida)
            {
                naoTemSaida = (idCidadeAtual == idCidadeOrigem && idSaidaAtual == QtdCidades && pilhaAuxiliar.EstaVazia);
                if (!naoTemSaida)
                {
                    while ((idSaidaAtual < QtdCidades) && !achouCaminho)
                    {
                        if (MatrizAdjacencia[idCidadeAtual, idSaidaAtual] == null)
                        {
                            idSaidaAtual++;
                        }

                        else if (jaPassou[idSaidaAtual])
                        {
                            idSaidaAtual++;
                        }

                        else if (idSaidaAtual == idCidadeDestino)
                        {
                            Movimento movimento = new Movimento(idCidadeAtual, idSaidaAtual);
                            pilhaAuxiliar.Empilhar(movimento);
                            achouCaminho = true;
                        }
                        else
                        {
                            Movimento movimento = new Movimento(idCidadeAtual, idSaidaAtual);
                            pilhaAuxiliar.Empilhar(movimento);
                            jaPassou[idCidadeAtual] = true;
                            idCidadeAtual           = idSaidaAtual;
                            idSaidaAtual            = 0;
                        }
                    }
                }
                if (!achouCaminho)
                {
                    if (!pilhaAuxiliar.EstaVazia)
                    {
                        jaPassou[idCidadeAtual] = false;
                        Movimento ultimoMovimento = pilhaAuxiliar.Desempilhar();
                        idSaidaAtual  = ultimoMovimento.IdCidadeDestino;
                        idCidadeAtual = ultimoMovimento.IdCidadeOrigem;
                        idSaidaAtual++;
                    }
                }
                if (achouCaminho)
                {
                    Caminho novoCaminho = new Caminho();
                    novoCaminho.Movimentos = pilhaAuxiliar.Clone();
                    caminhosEncontrados.Add(novoCaminho);
                    achouCaminho = false;
                    pilhaAuxiliar.Desempilhar();

                    for (int i = 0; i < QtdCidades; i++)
                    {
                        jaPassou[i] = false;
                    }

                    idSaidaAtual++;
                }
            }
            return(caminhosEncontrados);
        }
Esempio n. 21
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
            }
        }
Esempio n. 22
0
    public List <List <CaminhoEntreCidades> > Calcular(int origem, int destino)
    {
        PilhaLista <CaminhoEntreCidades>   pilha = new PilhaLista <CaminhoEntreCidades>();   //Serivirá para fazer o Backtracking
        List <List <CaminhoEntreCidades> > ret   = new List <List <CaminhoEntreCidades> >(); //Armazenará todos os caminhos que encontramos

        bool[] passouCidade = new bool[qtdCidades];                                          //Armazenaremos por quais cidades passamos
        int    cidadeAtual  = origem;
        int    saidaAtual   = 0;                                                             //Indica qual cidade tentaremos seguir

        while (!(cidadeAtual == origem && saidaAtual == qtdCidades))                         //Enquanto não tentamos todas as possibilidades da cidade inicial
        {
            if (saidaAtual < qtdCidades && cidadeAtual != destino)                           //Apenas continuaremos andando caso ainda hajam cidades a tentar e a
                                                                                             //cidade que estamos não é o destino
            {
                for (; saidaAtual < qtdCidades; saidaAtual++)                                //Tentaremos nos mover para todas as cidades
                {
                    if (passouCidade[saidaAtual] == false && cidades[saidaAtual, cidadeAtual] != null)
                    {
                        break; //Caso não passamos pela cidade sendo testada e caso exista uma conecção entre as cidades,
                    }
                }
                //podemos sair do for

                if (saidaAtual != qtdCidades) //Verificaremos se já tentamos todas as cidades, ou seja, se achamos algum caminho possível
                {
                    //Se achamos algum caminho
                    passouCidade[cidadeAtual] = true;                 //Marcaremos que passados pela determinada cidade
                    pilha.Empilhar(cidades[saidaAtual, cidadeAtual]); //Guardaremos o movimento que fizemos
                    cidadeAtual = saidaAtual;                         //Avançaremos a cidade
                    saidaAtual  = 0;                                  //Prepararemos a variável para o próximo ciclo
                }
            }
            else
            {
                if (cidadeAtual == destino) //Caso achamos o destino
                {
                    /*
                     * Iremos guardar o caminho feito até então, para isso, devemos esvaziar a pilha.
                     * Porém, existe a chance de ainda precisarmos usar a pilha nesse método, ou seja,
                     * a pilha deve continuar igual após lermos seus dados.
                     * Por conta disso, devemos colocar os dados da pilha atual numa auxiliar (1), vamos trabalhar
                     * com os dados (2) quando os repassarmos para a pilha atual (3).
                     * Por fim, forçaremos um backtracking, fazendo com que o algoritmo tente descobrir um novo caminho
                     */

                    PilhaLista <CaminhoEntreCidades> inver = new PilhaLista <CaminhoEntreCidades>();
                    List <CaminhoEntreCidades>       nova  = new List <CaminhoEntreCidades>();

                    while (!pilha.EstaVazia()) //(1)
                    {
                        inver.Empilhar(pilha.Desempilhar());
                    }

                    while (!inver.EstaVazia()) //(3)
                    {
                        CaminhoEntreCidades cid = inver.Desempilhar();
                        pilha.Empilhar(cid);
                        nova.Add(cid); //(2)
                    }

                    ret.Add(nova); //Guardaremos o caminho descoberto
                }

                //Fazendo Backtracking
                passouCidade[cidadeAtual] = false;           //Desmarcaremos que passamos pela cidade
                CaminhoEntreCidades c = pilha.Desempilhar(); //Recuperaremos o último movimento que fizemos
                cidadeAtual = c.Origem;                      //Voltaremos a cidade
                saidaAtual  = c.Destino + 1;                 //Evitaremos a possibilidade de acessarmos o mesmo caminho anterior
            }
        }

        return(ret);
    }