Проверка последовательности (){}[]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//Дана строка символов,содержащая три типа скобок: ( ), [ ] и { }.
//Необходимо проверить правильность расстановки скобок в строке,
//т.е. выяснить, имеется ли для каждой открывающей скобки соответствующая закрывающая скобка и наоборот,
//а также, не нарушены ли правила вложенности скобок. Символы, не являющиеся скобками,игнорируются.
//Алгоритм анализа скобочной структуры текста может быть следующим:
// - Встретив открывающую скобку, помещаем её в стек.
// - Обнаружив закрывающую скобку, проверяем, находится ли на вершине стека соответствующая открывающая скобка.
// Если проверка была неуспешной, то выдать сообщение об ошибке.
// - Если в исходном тексте закрывающих скобок оказывается больше,
// чем открывающих, то программа попытается извлечь символ из пустого стека
// и закончит работу с отрицательным результатом.
// - Наоборот, если в тексте открывающих скобок окажется больше, чем
// закрывающих, то после того, как весь текст будет прочитан и обработан, в
// стеке ещё останутся “незакрытые” скобки.
// - Таким образом, результат проверки текста окажется успешным, если во
// время работы ни разу не обнаружится несоответствия скобок, а также не
// возникнет ситуации исчерпания стека, причем в конце обработки текста
// стек окажется пустым.
using System;
using System.Collections.Generic;
namespace for_Firuz_z1
{
class Program
{
static void Main(string[] args)
{
List<char> beginer = new List<char> { '{', '[', '(' };
List<char> ender = new List<char> { '}', ']', ')' };
Stack<char> myStack = new Stack<char>();
try
{
System.IO.StreamReader file = new System.IO.StreamReader("input.txt");
while (!file.EndOfStream)
{
char temp = (char)file.Read();
Console.Write(temp);
foreach (char b in beginer) if (temp == b) myStack.Push(temp);
if (myStack.Count == 0) throw new Exception("Закрывающих скобок больше!");
foreach (char e in ender)
{
if (temp == e)
{
if(beginer.IndexOf(temp)==ender.IndexOf(myStack.Peek()))
{
myStack.Pop();
continue;
}
else throw new Exception("Несовпадение в последовательности!");
}
else continue;
}
}
if (myStack.Count != 0) throw new Exception("Открывающих скобок больше!");
Console.WriteLine("Последовательность корректна!");
file.Close();
}
catch (Exception er)
{
Console.WriteLine(er.Message);
}
Console.ReadKey();
}
}
}