Вы удаляете предметы из середины последовательности, поэтому сокращаете ее длину. Поэтому использование массивов только усложняет задачу.
Если ip
было List<string>
вместо string[]
:
i = index;
while (i < j)
{
if (ip[i] == "/")
{
ip[i - 1] = (double.Parse(ip[i - 1]) / double.Parse(ip[i + 1])).ToString();
ip.RemoveAt(i);
ip.RemoveAt(i);
j = j - 2;
i--;
}
i++;
}
Похоже, вы анализируете арифметическое выражение. Тем не менее, вы можете захотеть, чтобы круглые скобки контролировали порядок оценки, и это будет сложно с этой структурой.
Обновление: То, что говорит ваш код: Вы собираетесь сканировать последовательность строк. В любом месте этой последовательности вы можете найти символ оператора деления: /
. Если это так, вы предполагаете, что вещи по обе стороны могут быть проанализированы с double.Parse
. Но:
( 5 + 4 ) / ( 6 - 2 )
В этом примере токены по обе стороны от /
: )
и (
, поэтому double.Parse
не будет работать.
Так что я просто проверяю, что у вас есть еще один слой логики вне этого, который имеет дело с скобками. Например, возможно, вы сначала используете рекурсивный спуск, а затем запускаете только тот фрагмент кода, который вы разместили в последовательностях без скобок.
Если вы хотите, чтобы все это было более «объектным», вы можете рассматривать эту проблему как превращение последовательности токенов в дерево. Каждый узел в дереве может быть оценен. Значение корневого узла - это значение всего выражения. Число - это действительно простой узел, который оценивает само значение числа. Оператор имеет два дочерних узла. Группы круглых скобок просто исчезли бы из дерева - они используются для руководства, как вы его строите. Если бы у меня было какое-то время спустя, я мог бы развить это в короткий пример.
И еще один вопрос: как вы разбиваете всю строку на токены?