Складаються з елементів того самого типу. Тип елементів може бути будь-яким.
Зв'язок між елементами і доступ до черг здійснюється за допомогою типізованих і нетипізованих покажчиків. По цьому на ряді з інформацією кожен елемент черги повинний мати покажчик на наступний елемент.
Кількість елементів черги завчасно не задається. Воно може змінюватися в процесі виконання програми. Розмір одного елемента черги не може перевищувати 64 Кбайт.
При описі типу - черга, використовується рекурсія.
Доступ до елементів черги послідовний і обмежений. Він можливий із двох кінців. Один кінець черги, з якого можливе виключення елементів називається "головою" (Head), другий кінець - "хвіст" (Tail), з його здійснюється постановка елементів у чергу. Тому при створенні і використанні черги потрібно заготовити перемінні покажчики: на "голову" (Head) і "хвіст" (Tail). Це можуть бути нетипізовані покажчики типу Pointer. Доступ до інформації в такій структурі реалізується за принципом "Першим прийшов, першим пішов" Fifo (First in, First out). Завдяки цій особливості стекам іноді дають наступне визначення:
Ця структура даних в інформатику і програмування прийшла з життя - аналіз реальних черг (середня довжина черги, час перебування замовлення в черги, імовірність замовлення в постановці на чергу при обмеженні її довжини, дисципліна обслуговування черги). В інформатиці черги застосовуються для реалізації буфера клавіатури, багатозадачності, списки у виді черг реалізовані в мовах програмування Lisp, Prolog, Logo.
program QUEUE;
uses
crt;
type
QuePtr=^QUE;
QUE=record
Member:string;
EndPtr:QuePtr;
End;
var
Cl,Head,Tail:Pointer;
x,y:integer;
c:char;
Link:QuePtr;
Flag:boolean;
Number:Word;
procedure
menu;
Begin
clrscr;
gotoxy(20,1); Writeln('I-ВХІД У ЧЕРГУ;');
gotoxy(20,2);
Writeln('E-ВИХІД З ЧЕРГИ;');
gotoxy(20,3);
Writeln('V-ПЕРЕГЛЯД ЧЕРГИ;');
gotoxy(20,4);
Writeln('ESC-ВИХІД ІЗ ПРОГРАМИ.');
gotoxy(3,6);
Write('ВИЗНАЧИТЕ ДІЮ НАТИСКАННЯМ ВІДПОВІДНОЇ КЛАВІШІ
');
End;{menu}
procedure PutInQueue(var Inp:string;var
List:QuePtr);
var {ПОСТАНОВКА В
ЧЕРГУ}
Temp:Pointer;
Begin
New(List);
if
(Head=Nil)and(Tail=Nil)
then
Begin
Head:=List; Tail:=List;
List^.Member:=Inp;
End
else
Begin
List^.Member:=Inp; Temp:=List;
List:=Tail;
List^.EndPtr:=Temp; Tail:=List^.EndPtr;
List:=Tail;
End;
List^.EndPtr:=Nil;
End;{PutInQueue}
procedure
InitQueue;{ІНІЦІАЛІЗАЦІЯ}
Begin
Head:=Nil;Tail:=Nil;
Number:=0;
End;
procedure CreateQueue(var I:Word;var
List:QuePtr);
var
Ch:Char;
InpMem:String;
Begin
Ch:='
';x:=5;y:=1;
while (ord(ch)<>27)and(MaxAvail>SizeOf(QUE))
do
Begin
clrscr; gotoxy(x,y); inc(i); write(''Уведіть черговика з номером
',i,': ');
readln(InpMem); PutInQueue(InpMem,List); clrscr;
gotoxy(1,3);
write('ПРОДОВЖЕННЯ ВВЕДЕННЯ КЛАВІША ПРОБІЛ ЗАВЕРШЕННЯ КЛАВІША
ESC. ');
memw[0:$41a]:=memw[0:$41c];
ch:=readkey;
End;{while}
End;{CreateQueue}
procedure OutQueue(var
Ch:char;var List:QuePtr);
Begin {ВИХІД З ЧЕРГИ}
List:=Head; gotoxy(2,3);
write('Head: ',List^.Member); memw[0:$41a]:=memw[0:$41c];
ch:=readkey;
If
ord(Ch)<>27
then
Begin
Head:=List^.EndPtr; dec(Number);
dispose(List);
End;
if
Head=Nil
then
Tail:=Nil;
End;{OutQueue}
procedure OutFromQueue(var
I:Word;var List:QuePtr);
var
Ch:char;
Begin
Ch:=' ';
while
(Head<>NIL)AND(Tail<>NIL)AND(ord(Ch)<>27)
do
Begin
clrscr; gotoxy(15,1); write('КІЛЬКІСТЬ ЧЕРГОВИКІВ:',i);
gotoxy(1,6);
write('ВИХІД З ЧЕРГИ КЛАВІША ПРОБІЛ ЗАВЕРШЕННЯ КЛАВІША ESC.
');
OutQueue(Ch,List);
End;{WHILE}
IF
(Head=NIL)AND(Tail=NIL)
THEN
Begin
clrscr; gotoxy(22,3); write('ЧЕРГА
ПОРОЖНЯ.');
while ord(Ch)<>27 do
Begin
gotoxy(13,6); write('ДЛЯ
ВИХОДУ В МЕНЮ - КЛАВІША Esc.');
memw[0:$41a]:=memw[0:$41c];
Ch:=readkey;
End;
End;
End;{OutFromQueue}
procedure WriteQueue(var
List:QuePtr);
var i:integer; {ВИВЕДЕННЯ НА ЕКРАН}
Begin
i:=1;
If
(Head=Nil)and(Tail=Nil)
Then
Begin
gotoxy(30,12); write('ЧЕРГА
ПОРОЖНЯ.');
End
else
Begin
List:=Head; gotoxy(1,1); write('Head:
');
while List<>Nil do
Begin
if (Wherex>70)and(Wherey = 20
)
then
Begin
writeln('. . .'); gotoxy(20,22); Write('Для продовження
натисніть пробіл:');
memw[0:$41a]:=memw[0:$41c]; c:=readkey;
ClrScr;gotoxy(1,1);write('Head: . . . ');
End;
Write(i,'.',List^.Member,'
'); inc(i); List:=List^.EndPtr;
End;{WHILE}
write('
:Tail');
End;
while ord(c)<>27 do
Begin
gotoxy(23,23);
write('ДЛЯ ВИХОДУ В МЕНЮ - КЛАВІША Esc.'); memw[0:$41a]:=memw[0:$41c];
c:=readkey;
End;
End;
Begin
Clrscr;
InitQueue;
Mark(Cl);
Flag:=True;
menu;
while
Flag do
Begin
memw[0:$41a]:=memw[0:$41c]; c:=readkey;
case c
of
'I','i' :Begin
CreateQueue(Number,Link);
menu;
End;
'E','e','и','И':Begin
OutFromQueue(Number,Link);
menu;
End;
'V','v':Begin
WriteQueue(Link);
menu;
End;
#27:Begin
Flag:=False;
End;
End;{case}
End;{while}
Release(Cl);
End.