Я читаю Второе издание "Руководство по разработке алгоритмов", и это связано с вопросом упражнения. Цитируя вопрос
Общая проблема для компиляторов и текстовые редакторы определяют, круглые скобки в строке сбалансированным и правильно вложенным. Для Например, строка ((())())() содержит правильно вложенные пары круглые скобки, в которых строки)() ( и не. Дайте алгоритм, который возвращает true, если строка содержит правильно вложенные и сбалансированные скобки и false, если в противном случае. Для получения полного кредита укажите позицию первой оскорбительной круглой скобки, если строка не является надлежащим образом вложенной и сбалансированным.
Вопрос находится в категории стеков, очередей и списков. Вот что я написал в С#.
const char LeftParenthesis = '(';
const char RightParenthesis = ')';
bool AreParenthesesBalanced(string str, out int errorAt)
{
var items = new Stack<int>(str.Length);
errorAt = -1;
for (int i = 0; i < str.Length; i++)
{
char c = str[i];
if (c == LeftParenthesis)
items.Push(i);
else if (c == RightParenthesis)
{
if (items.Count == 0)
{
errorAt = i + 1;
return false;
}
items.Pop();
}
}
if (items.Count > 0)
{
errorAt = items.Peek() + 1;
return false;
}
return true;
}
Это хорошо работает. Но я не уверен, что это правильный метод для решения этой проблемы. Любые лучшие идеи приветствуются.