Используя стек, проверить, является ли правильной скобочная последовательность - C#
Формулировка задачи:
Используя стек, проверить, является ли правильной скобочная последовательность, в которую входят скобки трех типов: , { }, .
Формат входных данных
Входной файл состоит из одной строки, представляющей собой последовательность скобок без пробелов.
Формат выходных данных
Выведите в выходной файл yes , если скобочная последовательность правильная или no в противном случае.
Примеры:
Вход
()({[]()}[])
Выход
Yes
Вход
([)]
Выход
No
Вход
([()]
Выход
No
Решение задачи: «Используя стек, проверить, является ли правильной скобочная последовательность»
textual
Листинг программы
void Main()
{
var s = "()({[]()}[])";
var checker = new BracketsChecker();
foreach (var ch in s)
checker.Put(ch);
Console.WriteLine(checker.Balanced);
}
class BracketsChecker
{
private readonly string _opening = "([{";
private readonly string _closing = ")]}";
private bool _cantBeBalanced;
private Stack<int> _opened = new Stack<int>();
public bool Balanced => !_cantBeBalanced && !_opened.Any();
public void Put(char ch)
{
if (_cantBeBalanced) return;
int index = _opening.IndexOf(ch);
if (index != -1)
{
_opened.Push(index);
return;
}
index = _closing.IndexOf(ch);
if (index != -1)
{
if (!_opened.Any() || _opened.Peek() != index)
{
_cantBeBalanced = true;
_opened.Clear();
_opened.TrimExcess();
return;
}
_opened.Pop();
return;
}
}
}