/// <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; } } }