Знакомый попросил помочь с задачей:

> -- Цитата:
> Используя представление стека с помощью массива, напишите на языке паскаль программу которая считывает символьную строку, содержащую три набора скобок (<<(<< и >>)>>),   (<< < << и >> > >>),   (<<[<< и >>]>>) и проверить правильно ли расставлены в этой строке скобки.

Решение на Турбо Паскале:

## Код:
```
PROGRAM Kur0510;

   CONST
      (* Kody tokenov dlja otkryvajuschih skobok *)
      bracket1 = 1; (* (<<(<< *)
      bracket2 = 2; (* (<< < << *)
      bracket3 = 3; (* (<<[<< *)
         (* Dlya zakryvajuschih beretsya so znakom - *)
      other = 4;
      eof = 0;

      br1open = '(<<(<<';
      br1close = '>>)>>)';
      br2open = '(<< < <<';
      br2close = '>> > >>)';
      br3open = '(<<[<<';
      br3close = '>>]>>)';

   TYPE
      Token = INTEGER;

   VAR
      input: STRING;
      ipos: INTEGER;

      curToken: Token;

      stack: ARRAY [0..1024] OF Token;
      spos: INTEGER;

   PROCEDURE ScanToken; FORWARD;

   FUNCTION ProcessInput: BOOLEAN;
      VAR ok: BOOLEAN;
   BEGIN
      ok := TRUE;
      spos := 0;
      ScanToken;
      WHILE (curToken <> eof) AND ok DO BEGIN
         CASE curToken OF
         bracket1, bracket2, bracket3:
            BEGIN
               stack[spos] := curToken;
               INC(spos)
            END;
         -bracket1, -bracket2, -bracket3:
            BEGIN
               IF (spos > 0) AND (stack[spos-1] = -curToken) THEN BEGIN
                  DEC(spos)
               END
               ELSE BEGIN
                  ok := FALSE
               END
            END
         END;
         ScanToken
      END;
      ok := ok AND (spos = 0);
      ProcessInput := ok
   END (* ProcessInput *);

   PROCEDURE CheckBracket (VAR isBracket: BOOLEAN; VAR brToken: Token;
      VAR len: INTEGER); FORWARD;

   PROCEDURE ScanToken;
      VAR isBracket: BOOLEAN;
            brToken: Token;
            brLen: INTEGER;
   BEGIN
      IF ipos <= LENGTH(input) THEN BEGIN
         CheckBracket(isBracket, brToken, brLen);
         IF isBracket THEN BEGIN
            curToken := brToken;
            INC(ipos, brLen)
         END
         ELSE BEGIN
            curToken := other;
            INC(ipos)
         END
      END
      ELSE BEGIN
         curToken := eof
      END
   END (* ScanToken *);

   FUNCTION Look (lexem: STRING): BOOLEAN;
      VAR i, j: INTEGER;
   BEGIN
      IF ipos + LENGTH(lexem)-1 <= LENGTH(input) THEN BEGIN
         i := ipos; j := 1;
         WHILE (j <= LENGTH(lexem)) AND (input[i] = lexem[j])
         DO BEGIN
            INC(i); INC(j)
         END;
         Look := j = LENGTH(lexem) + 1   (* To est, vse simvoly sovpali *)
      END
      ELSE BEGIN
         Look := FALSE
      END
   END (* Look *);

   PROCEDURE CheckBracket (VAR isBracket: BOOLEAN; VAR brToken: Token;
      VAR len: INTEGER);
   BEGIN
      IF Look(br1open) THEN BEGIN
         isBracket := TRUE;
         brToken := bracket1;
         len := LENGTH(br1open)
      END
      ELSE IF Look(br1close) THEN BEGIN
         isBracket := TRUE;
         brToken := -bracket1;
         len := LENGTH(br1close)
      END
      ELSE IF Look(br2open) THEN BEGIN
         isBracket := TRUE;
         brToken := bracket2;
         len := LENGTH(br2open)
      END
      ELSE IF Look(br2close) THEN BEGIN
         isBracket := TRUE;
         brToken := -bracket2;
         len := LENGTH(br2close)
      END
      ELSE IF Look(br3open) THEN BEGIN
         isBracket := TRUE;
         brToken := bracket3;
         len := LENGTH(br3open)
      END
      ELSE IF Look(br3close) THEN BEGIN
         isBracket := TRUE;
         brToken := -bracket3;
         len := LENGTH(br3close)
      END
      ELSE BEGIN
         isBracket := FALSE
      END
   END (* CheckBracket *);

BEGIN
   Write('Input string: ');
   ReadLn(input);
   ipos := 1;
   IF ProcessInput THEN BEGIN
      WriteLn('ok')
   END
   ELSE BEGIN
      WriteLn('Error!')
   END;
   WriteLn('Press Enter...');
   ReadLn
END.
```
