RosettaCodeData/Task/Balanced-brackets/Component-Pascal/balanced-brackets.pas

61 lines
1.3 KiB
ObjectPascal
Raw Permalink Normal View History

2023-07-01 11:58:00 -04:00
MODULE Brackets;
IMPORT StdLog, Args, Stacks (* See Task Stacks *);
TYPE
2026-02-01 16:33:20 -08:00
Character = POINTER TO RECORD (Stacks.Object)
c: CHAR
END;
2023-07-01 11:58:00 -04:00
PROCEDURE NewCharacter(c: CHAR): Character;
VAR
2026-02-01 16:33:20 -08:00
n: Character;
2023-07-01 11:58:00 -04:00
BEGIN
2026-02-01 16:33:20 -08:00
NEW(n);n.c:= c;RETURN n
2023-07-01 11:58:00 -04:00
END NewCharacter;
PROCEDURE (c: Character) Show*;
BEGIN
2026-02-01 16:33:20 -08:00
StdLog.String("Character(");StdLog.Char(c.c);StdLog.String(");");StdLog.Ln
2023-07-01 11:58:00 -04:00
END Show;
PROCEDURE CheckBalance(str: ARRAY OF CHAR): BOOLEAN;
VAR
2026-02-01 16:33:20 -08:00
s: Stacks.Stack;
n,x: ANYPTR;
i: INTEGER;
c : CHAR;
2023-07-01 11:58:00 -04:00
BEGIN
2026-02-01 16:33:20 -08:00
i := 0; s := Stacks.NewStack();
WHILE (i < LEN(str$)) & (~Args.IsBlank(str[i])) & (str[i] # 0X) DO
IF s.Empty() THEN
s.Push(NewCharacter(str[i]));
ELSE
n := s.top.data;
WITH
n : Character DO
IF (str[i] = ']')& (n.c = '[') THEN
x := s.Pop();
ELSE
s.Push(NewCharacter(str[i]))
END;
ELSE RETURN FALSE;
END;
END;
INC(i)
END;
RETURN s.Empty();
2023-07-01 11:58:00 -04:00
END CheckBalance;
PROCEDURE Do*;
VAR
2026-02-01 16:33:20 -08:00
p : Args.Params;
i: INTEGER;
2023-07-01 11:58:00 -04:00
BEGIN
2026-02-01 16:33:20 -08:00
Args.Get(p); (* Get Params *)
FOR i := 0 TO p.argc - 1 DO
StdLog.String(p.args[i] + ":>");StdLog.Bool(CheckBalance(p.args[i]));StdLog.Ln
END
2023-07-01 11:58:00 -04:00
END Do;
END Brackets.