Example #1
0
        /// <summary>
        /// Evento de clique no botão de igual
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnIgual_Click(object sender, EventArgs e)
        {
            SequenciaInfixa  infixa  = new SequenciaInfixa(edVisor.Text);
            SequenciaPosfixa posfixa = new SequenciaPosfixa(infixa);

            lbSequencias.Text = "Infixa: " + infixa + "\r\nPosfixa: " + posfixa;

            try
            {
                edResultado.Text = string.Format("{0}", posfixa.Calcular());
            }
            catch (InvalidOperationException)
            {
                MessageBox.Show(this, "A expressão digitada é inválida :(", "Ooops", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="infixa">Sequência infixa a partir da qual criar a sequência posfixa</param>
        public SequenciaPosfixa(SequenciaInfixa infixa)
        {
            Valores   = infixa.Valores;
            Expressao = "";

            Stack <char> pilhaSimbolos  = new Stack <char>();
            bool         valorAEsquerda = false;

            // Percorre todos os caracteres na string
            for (int i = 0; i < infixa.Expressao.Length; i++)
            {
                char c = infixa.Expressao[i];

                if (c == ' ')
                {
                    continue;
                }

                // Se o caractere for uma letra
                if (char.IsLetter(c))
                {
                    Expressao     += c;
                    valorAEsquerda = true;
                }

                // Se não for, é um operador
                else
                {
                    if (!valorAEsquerda && (c == '-' || c == '+'))
                    {
                        if (c == '-')
                        {
                            c = '@';
                        }
                        else
                        {
                            continue;   // + unário é inútil
                        }
                    }
                    // Desempilha enquanto a prioridade do operador atual for menor que a do topo da pilha
                    while (pilhaSimbolos.Count > 0 && TemPrioridade(pilhaSimbolos.Peek(), c))
                    {
                        char op = pilhaSimbolos.Pop();
                        if (op != '(')
                        {
                            Expressao += op;
                        }
                        else if (c == ')')
                        {
                            break;
                        }
                    }

                    valorAEsquerda = false;

                    if (c != ')')   // ) não deve aparecer na sequência
                    {
                        pilhaSimbolos.Push(c);
                    }
                    else
                    {
                        valorAEsquerda = true;
                    }
                }
            }

            while (pilhaSimbolos.Count > 0)
            {
                char op = pilhaSimbolos.Pop();
                if (op != '(' && op != ')')
                {
                    Expressao += op;
                }
            }
        }