Exemple #1
0
        private FilaLista <char> CriarInfixa(ref string infixa)
        {
            FilaLista <char> seqInfixa = new FilaLista <char>();

            char letra = 'A';                                                                                                  //char que irá de A a Z para "substituir" os números

            valores = new double[26];                                                                                          //instanciação do vetor de valores
            string numero = "";                                                                                                //string que armazenará um valor lido, caracter por caracter

            for (int i = 0; i < txtVisor.Text.Length && !erro; i++)                                                            //percorre string do txtVisor, indexando-o como um vetor, até acabar as posições
            {
                char caracterAtual = (txtVisor.Text)[i];                                                                       //pega o caracter atual pelo index do for

                int num;                                                                                                       //variável apenas com fim de ser usada no tryParse
                if (int.TryParse(caracterAtual.ToString(), out num) || caracterAtual.Equals('.') || caracterAtual.Equals(',')) //se o valor for um número inteiro(como se está analisando apenas um caracter isolado, não se precisa usar double.TryParse)
                {                                                                                                              // ou se for um '.', ou seja, uma vírgula do double, ele faz parte de um número
                    if (caracterAtual.Equals('.'))
                    {
                        caracterAtual = ',';
                    }
                    numero += caracterAtual;                     //concatena caracter do número em formação
                }
                else if (numero != "")                           //se caracter lido não fizer mais parte de um número e a variável numero não for vazia
                {
                    valores[letra - 'A'] = double.Parse(numero); //armazena-se valor do número formado, convertendo-o para double
                    infixa += letra + "" + caracterAtual;        //concatena-se o número e o caracter lido na string infixa
                    seqInfixa.Enfileirar(letra);                 //enfileira letra referente a posição do número no vetor de valores
                    seqInfixa.Enfileirar(caracterAtual);         //enfileira caracter de operação
                    numero = "";                                 //esvazia string de número para que comece a formação de um novo caso haja
                    letra++;                                     //vai para a próxima letra
                }
                else //se o caracter lido for referente a uma operação mas não houver um número na variável numero (está vazia)
                {
                    if (caracterAtual.Equals('-') || caracterAtual.Equals('+')) //o caracter pode fazer parte do número, como "-1", mas daí o '+'/'-' tem que
                    {                                                           //estar logo no começo da sequência, ou estar precedido de '('
                        if (seqInfixa.EstaVazia() || seqInfixa.OFim().Equals('('))
                        {
                            numero += caracterAtual;
                        }
                        else
                        {
                            seqInfixa.Enfileirar(caracterAtual); //enfileira-se caracter atual
                            infixa += caracterAtual;             //concatena-se caracter atual em infixa
                        }
                    }
                    else
                    {
                        seqInfixa.Enfileirar(caracterAtual); //enfileira-se caracter atual
                        infixa += caracterAtual;             //concatena-se caracter atual em infixa
                    }
                }

                if (i + 1 == txtVisor.Text.Length && (numero != "") && !erro) // se o próximo index do vetor for o fim da operação mas o número não estiver vazio
                {
                    valores[letra - 'A'] = double.Parse(numero);              //armazena valor no vetor de valores
                    seqInfixa.Enfileirar(letra);                              //enfileira letra correspondente a valor
                    infixa += letra + "";                                     //concatena letra à sequencia infixa
                    numero  = "";                                             //esvazia número
                    letra++;                                                  //vai à próxima letra
                }
            }

            lblInfixa.Text = infixa; //exibe sequência infixa formada no lblInfixa

            return(seqInfixa);
        }