vipak/CharacterStack.Mod
2019-05-11 21:51:55 +04:00

121 lines
No EOL
2.8 KiB
Modula-2

MODULE CharacterStack;
IMPORT List, Out, Sys;
TYPE
integer* = Sys.integer;
TObject* = Sys.TObject;
Node* = POINTER TO NodeDesc;
NodeDesc* = List.NodeDesc;
TChar* = POINTER TO TCharDesc;
TCharDesc = RECORD (Sys.TObjectDesc)
char* : CHAR
END;
string = Sys.string;
CharacterStackType* = POINTER TO CharacterStackTypeDesc;
CharacterStackTypeDesc* = RECORD (List.TListDesc)
pop*: PROCEDURE(self: CharacterStackType): CHAR;
push*: PROCEDURE(self: CharacterStackType; char: CHAR);
top*: PROCEDURE(self: CharacterStackType) : CHAR;
END;
VAR
characterStack: CharacterStackType;
PROCEDURE push(self: CharacterStackType; char: CHAR);
VAR
ch: TChar;
int: integer;
BEGIN
NEW(ch);
ch.char := char;
int := self.Add(self, ch);
END push;
PROCEDURE pop(self: CharacterStackType): CHAR;
VAR
n: Node;
BEGIN
NEW(n);
IF self.Count = 0 THEN RETURN 0X END;
n := self.Get(self, self.Count - 1);
self.Delete(self, self.Count - 1);
RETURN n.obj(TChar).char;
END pop;
PROCEDURE top(self: CharacterStackType): CHAR;
VAR
n: Node;
BEGIN
NEW(n);
IF self.Count = 0 THEN RETURN 0X END;
n := self.Get(self, self.Count - 1);
RETURN n.obj(TChar).char;
END top;
PROCEDURE Create* () : CharacterStackType;
VAR
l : CharacterStackType;
BEGIN
NEW(l);
l.First := NIL;
l.Last := NIL;
l.Count := 0;
l.Add := List.Add;
l.Append := List.Append;
l.AppendList := List.AppendList;
l.Clear := List.Clear;
l.Free := List.Free;
l.Insert := List.Insert;
l.Delete := List.Delete;
l.Empty := List.Empty;
l.Get := List.Get;
l.res := TRUE;
l.pop := pop;
l.push:= push;
l.top := top;
RETURN(l);
END Create;
BEGIN
(* NEW(characterStack);
characterStack := Create();
characterStack.push(characterStack, 'a');
characterStack.push(characterStack, 'b');
characterStack.push(characterStack, 'c');
Out.Char(characterStack.top(characterStack));
Out.Ln();
Out.Char(characterStack.pop(characterStack));
Out.Ln();
Out.Char(characterStack.top(characterStack));
Out.Ln();
Out.Char(characterStack.pop(characterStack));
Out.Ln();
Out.Char(characterStack.top(characterStack));
Out.Ln();
Out.Char(characterStack.pop(characterStack));
Out.Ln();
Out.Char(characterStack.top(characterStack));
Out.Ln();
Out.Char(characterStack.pop(characterStack));
Out.Ln();
Out.Char(characterStack.top(characterStack));
Out.Ln();
Out.Char(characterStack.pop(characterStack));
Out.Ln();
Out.Char(characterStack.top(characterStack));
Out.Ln();
Out.Char(characterStack.pop(characterStack));
Out.Ln(); *)
END CharacterStack.