1. Ðịnh nghĩa : TOP
Hăng lă một danh sâch đặc biệt mă phĩp thím văo chỉ thực hiện ở một đầu của danh sâch gọi lă cuối hăng (Rear). Phĩp loại bỏ lại được thực hiện ở một đầu kia của danh sâch gọi lă đầu hăng (Front). Như vậy hăng lă một cấu trúc dữ liệu có tính chất "Văo trước - ra trước" - FIFO : First In First Out.
2. Câc phĩp toân cơ bản tín hăng : TOP
ạ Thủ tục MakeNullQueue (Var Q : Queue) : Tạo một hăng rỗng.
b. Hăm Front (Q : Queue) : ElementType : Trả về kết quả lă phần tử đầu hăng. c. Thủ tục EnQueue (x : ElementType; Var Q : Queue) : Ðặt phần tử x văo cuối của hăng.
d. Thủ tục DeQueue (Var Q : Queue) : Xóa một phần tử đầu hăng.
ẹ Hăm EmptyQ (Q : Queue ) : Boolean : Kiểm tra xem một Queue có rỗng hay không? Hăm trả về giâ trị True nếu Queue rỗng vă False nếu ngược lạị
f. Hăm FullQ (Q : Queue ) : Boolean : Kiểm tra xem một Queue có đầy hay không? Hăm trả về giâ trị True nếu Queue đầy vă False nếu ngược lạị
3. Căi đặt hăng :
TOP ạ Căi đặt hăng bằng mảng: Ta dùng một mảng để chứa câc phần tử của hăng. Phần tử đầu hăng xếp văo vị trí thứ nhất của mảng, phần tử thứ hai xếp văo vị trí thứ 2,... Giả sử mảng có n phần tử ta có Front = 1 vă Rear = n. Khi xóa một phần tử Front tăng lín 1, khi thím một phần tử văo hăng Rear tăng lín 1. Như vậy, hăng có khuynh hướng đi xuống vă đến một lúc năo đó ta không thể thím văo hăng được nữa dù rằng mảng còn nhiều chỗ trống. Ta gọi lă hăng bị trăn. Trong trường hợp toăn bộ mảng đê chứa câc phần tử ta gọi lă hăng bị đầỵ
Câch khắc phục hăng bị trăn:
Dời toăn bộ hăng lín Front - 1 vị trí. Câch năy gọi lă di chuyển tịnh tiến vă ta luôn có Front < Rear.
Xem mảng như lă một vòng tròn nghĩa lă khi hăng bị trăn nhưng chưa đầy, ta thím phần tử mới văo vị trí thứ nhất của mảng, thím phần tử thứ 2 văo vị trí thứ 2 của mảng,... (nếu có thể ). Câch năy gọi lă mảng vòng.
* Căi đặt hăng bằng phương phâp di chuyển tịnh tiến: • Khai bâo :
Const Maxlength = ...; { Ðộ dăi mảng } Type ElementType = ...; { Kiểu phần tử }
Queue = Record
Elements : array[1..Maxlength] of ElementType; Front, Rear : integer;
End;
• Thủ tục khởi tạo Queue rỗng :
Procedure MakeNullQueue ( Var Q : Queue);
Begin
Q. Front := 0; Q. Rear := 0; End;
• Hăm kiểm tra Queue rỗng :
Function EmptyQ (Q : Queue) : Boolean;
Begin
EmptyQ := (Q.Front = 0); End;
• Hăm kiểm tra Queue đầy :
Function FullQ (Q : Stack):Boolean;
Begin
FullQ := (( Q.rear - Q.Front + 1) = Maxlenght); End;
• Hăm ütruy xuất phần tử đầu hăng :
Function Front ( Q: Queue ) : ElementsType;
Begin
Front := (Q.Elements [Q.Front]);
• Thủ tục xen một phần tử văo cuối hăng :
Procedure EnQueue (x : ElementsType; Var Q: Queue);
Var i : integer; Begin
If not FullQ (Q) then Begin
If EmptyQ (Q) then Q.Front := 1; If Q.Rear = Maxlenght then
Begin
For i := Q.Front to Q.Rear do
Q.Elements [i - Q.Front + 1] := Q.Elements[i]; Q.Rear := Maxlenght - Q.Front + 1;
End;
Q.Rear := Q.Rear + 1; Q.Elements [Q.Rear] := x; End
Else Write ('Hang daý); End;
• Thủ tục xóa một phần tử đầu hăng :
Procedure DeQueue ( Var Q: Queue);
Begin
If not EmptyQ (Q) then Begin
Q.Front := Q.Front + 1; If Q.Front > Q.Rear then MakeNullQueue (Q); End
Else
Write ('Queue rong'); End;
* Căi đặt hăng bằng mảng vòng:
• Hăm kiểm tra Queue đầy :
Function FullQ (Q : Stack):Boolean;
Begin
FullQ := (( Q.rear - Q.Front + 1) mod Maxlenght = 0); End;
• Thủ tục xen một phần tử văo cuối hăng :
Procedure EnQueue (x : ElementsType; Var Q: Queue);
Begin
If not FullQ (Q) then Begin
If EmptyQ (Q) then
Q.Front := 1;
Q.Rear := (Q.rear mod Maxlenght) + 1; Q.Elements [Q.Rear] := x;
End Else
Write ('Hang daý); End;
• Thủ tục xóa một phần tử đầu hăng :
Procedure DeQueue ( Var Q: Queue);
Begin
If not EmptyQ (Q) then If Q.Front = Q.Rear then
MakeNullQueue (Q) Else
Q.Front := (Q.Front mod Maxlenght) + 1 Else
Write ('Queue rong'); End; Front Đầu hàng ... Cuối hàng Nil Rear
b. Căi đặt hăng bằng con trỏ:
Ta sẽ dùng 2 con trỏ Front vă Rear để quản lý hăng (Front chỉ đến phần tử đầu
hăng, Rear chỉ đến phần tử cuối hăng). • Khai bâo :
Type ElementType = ...; { Kiểu phần tử } CellType = ^ Cell; Cell = Record Elements : ElementType; Next: CellType; End; Queue = Record
Front, Rear : CellType; End;
• Thủ tục khởi tạo Queue rỗng :
• Hăm kiểm tra Queue rỗng :
Function EmptyQ (Q : Queue) : Boolean;
Begin
EmptyQ := (Q.Front = Q.Rear); End; • Q.Front Q.Rear * Nil ... (2) (4) x (3)
• Thủ tục xen một phần tử văo cuối hăng :
Begin If EmptyQ (Q) then Begin New (Q.front); Q.Front^.Elements := x; Q.Front^.Next := Nil; Q.Rear := Q.Front; End Else Begin New (Q.rear^.Next); Q.rear := Q.rear^.Next; Q.rear^.Elements :=x; Q.rear^.Next := Nil; End; End;
• Thủ tục xóa một phần tử đầu hăng :
Procedure DeQueue ( Var Q: Queue);
Var Temp : CellType; Begin
If not EmptyQ (Q) then Begin Temp := Q.Front; Q.front := Q.Front^.Next; Dispose (Temp); End Else
Write ('Queue rong'); End;
V. DANH SÂCH LIÍN KẾT KĨP (DOUBLE LINK LIST) 1. Nhận xĩt :