private void AddBraskets(int opening = 0, int closing = 0) { if (brasketFlag) { brasketFlag = false; return; } if (closing > 0 && closing > opening + BrasketsSum()) { throw new ArgumentException(); } Braskets.Add(opening); Braskets.Add(closing); }
private Expression JoinExpression(int from, int to) { if (Braskets.Skip(2 * from).Take(2 * to).All(b => b == 0)) { return(joinSimpleSequence(from, to)); } int i; for (i = 2 * from; i < 2 * to && Braskets[i] == 0; i += 2) { ; //нашли первую(ые) открывающую(ие) скобку(и) } var j = IndexOfClosingBrasket(Braskets, i); // нашли индекс где закрываются все те скобки var left = Expressions.GetRange(0, i / 2); //взяли то что слева ото всех скобок (м.б. и ничего если скобки открываются сразу) Braskets[i]--; Braskets[j]--; left.Add(JoinExpression(i / 2, j / 2));//добавили результат соединения междускобочной части return(joinSimpleSequence(left)); }
private int BrasketsSum() { int sign = 1; return(Braskets.Aggregate((o, c) => o + (c * (sign *= -1)))); }