Unit Unit_Queue; interface Uses Unit_Types; type PEl = ^TEl; TEl = record info: TInfo; next: PEl; end; TQueue = record first, last: PEl; end; procedure Init(var q: TQueue); function IsEmpty(q: TQueue): boolean; function Pop(var q: TQueue): TInfo; procedure Push(var q: TQueue; a: TInfo); procedure Input(f: text; var q: TQueue); procedure Output(q: TQueue); procedure Delete(var q: TQueue; f: func); implementation procedure Init(var q: TQueue); begin q.first := nil; q.last := nil; end; function IsEmpty(q: TQueue): boolean; begin result := q.first = nil; end; function Pop(var q: TQueue): TInfo; var p: PEl; begin if not isempty(q) then begin result := q.first^.info; p := q.first; q.first := q.first^.next; dispose(p); end; end; procedure Push(var q: TQueue; a: TInfo); var p: PEl; begin new(p); p^.info := a; p^.next := nil; if IsEmpty(q) then q.first := p else q.last^.next := p; q.last := p; end; procedure Input(f: text; var q: TQueue); var a: TInfo; begin while not eof(f) do begin read(f, a); Push(q, a); end; end; procedure Output(q: TQueue); var p: TInfo; begin while not IsEmpty(q) do begin p := Pop(q); write(p, ' '); end; writeln(); end; procedure Delete(var q: TQueue; f: func); var q2: TQueue; a: TInfo; begin init(q2); while not isempty(q) do begin a := pop(q); if not f(a) then Push(q2, a); end; q.first := q2.first; q.last := q2.last; end; end.