public static Opz fromInfix(string input) { var res = new Opz(); Stack <char> stack = new Stack <char>(); bool checkMinus = true; string number = ""; foreach (var symbol in input) { if (char.IsWhiteSpace(symbol)) { continue; } if (char.IsDigit(symbol) || symbol == '.' || symbol == ',' || (symbol == '-' && checkMinus)) { number += symbol; } else { res.addNumber(ref number); if (symbol == '(') { stack.Push(symbol); } else if (symbol == ')') { while (stack.Count > 0 && stack.Peek() != '(') { res.opz.Add(stack.Pop()); } if (stack.Count <= 0 || stack.Peek() != '(') { throw new Exception("В выражении либо неверно поставлен разделитель, либо не согласованы скобки"); } stack.Pop(); } else if (isBinaryOp(symbol)) { while (stack.Count > 0 && isPriorityHigher(stack.Peek(), symbol)) { res.opz.Add(stack.Pop()); } stack.Push(symbol); } } checkMinus = symbol == '('; } res.addNumber(ref number); while (stack.Count > 0 && isOperation(stack.Peek())) { res.opz.Add(stack.Pop()); } if (stack.Count > 0) { throw new Exception("В выражении не согласованы скобки"); } return(res); }
private void Calculation_Click(object sender, EventArgs e) { Opz opz = null; try { opz = Opz.fromInfix(TextBoxPol.Text); RichTextBoxPol.Text = opz.toString(); } catch (Exception ex) { RichTextBoxPol.Text = "Ошибка: " + ex.Message; return; } try { RichTextBoxPol.Text += " = " + opz.evaluate().ToString(); } catch (Exception ex) { RichTextBoxPol.Text = "Ошибка: " + ex.Message; } }