Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static class BracketsChecker {
- public class BracketErrorException : ApplicationException {
- public BracketErrorException(string message)
- : base(message) {
- }
- }
- public class BracketMismatchException : BracketErrorException {
- public readonly char openChar;
- public readonly char closeChar;
- public readonly int closePosition;
- public BracketMismatchException(char openChar, char closeChar, int closePosition)
- : base(string.Format("Bracket mismatch at {2}: got \"{1}\" for opening \"{0}\"", openChar, closeChar, closePosition)) {
- this.openChar = openChar;
- this.closeChar = closeChar;
- this.closePosition = closePosition;
- }
- }
- public class ExtraOpeningBracketException : BracketErrorException {
- public ExtraOpeningBracketException()
- : base("Extra opening bracket") {
- }
- }
- public class ExtraClosingBracketException : BracketErrorException {
- public readonly char closeChar;
- public readonly int closePosition;
- public ExtraClosingBracketException(char closeChar, int closePosition)
- : base(string.Format("Extra closing bracket at {1}: \"{0}\"", closeChar, closePosition)) {
- this.closeChar = closeChar;
- this.closePosition = closePosition;
- }
- }
- private class Bracket {
- char[] openChars;
- char[] closeChars;
- public Bracket(char[] openChars, char[] closeChars) {
- this.openChars = openChars;
- this.closeChars = closeChars;
- }
- }
- private static readonly Bracket[] Brackets = new[] {
- new Bracket(new[] { '(' }, new[] { ')' }),
- new Bracket(new[] { '[' }, new[] { ']' }),
- new Bracket(new[] { '{' }, new[] { '}' }),
- }
- private static readonly Dictionary<char, Bracket> BracketsByOpenChar =
- (
- from bracket in Brackets
- from openChar in bracket.openChars
- select new KeyValuePair<char, Bracket>(openChar, bracket)
- ).ToDictionary();
- private static readonly HashSet<char> CloseChars =
- new HashSet<char>(
- from bracket in Brackets
- from closeChar in bracket.CloseChars
- select closeChar
- );
- public static void CheckString(string str) {
- Stack<Bracket> currentState = new Stack<Bracket>();
- for(int i=0; i<str.length; i++) {
- if(BracketsByOpenChar.ContainsKey(str[i])) {
- currentState.Push(BracketsByOpenChar[str[i]]);
- } else if(CloseChars.Contains(str[i])) {
- if(currentState.IsEmpty) {
- throw new ExtraClosingBracketException();
- }
- if(!currentState.Peek().closeChars.Contains(str[i])) {
- throw new BracketsMismatchException();
- }
- currentState.Pop();
- }
- }
- if(!currentState.IsEmpty) {
- throw new ExtraOpeningBracketException();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement