CẤU TRÚC HĂNG ÐỢ

Một phần của tài liệu Tài liệu cấu trúc dữ liệu cơ bản (Trang 27)

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 :

Một phần của tài liệu Tài liệu cấu trúc dữ liệu cơ bản (Trang 27)

Tải bản đầy đủ (DOC)

(91 trang)
w