Hàng đợi (Queue)

Một phần của tài liệu giáo trình cấu trúc dữ liệu (Trang 56 - 63)

DANH SÁCH LIấN KẾT 4.1 Giới thiệu

4.5.2 Hàng đợi (Queue)

Hàng đợi là một danh sỏch mà phộp thờm vào được thực hiện ở đầu này và loại bỏ được thực hiện ở đầu kia. Như vậy, phần tử nào vào trước sẽ được loại bỏ trước, phần tử nào vào sau sẽ được loại bỏ sau, nờn hàng đợi cũn được gọi là danh sỏch FIFO (First In First Out list). Vỡ vậy hàng đợii là cấu trỳc thớch hợp để lưu trữ cỏc dữ liệu được xử lý theo thứ tự mà chỳng tạo ra.

a) Với Queue được mụ tả bằng mảng:

Khi mụ tả hàng đợi bằng mảng, ta cú hai chỉ số First và Last, First lưu chỉ số phần tử đầu của hàng đợi, Last lưu chỉ số phần tử cuối cựng của hàng đợi. khởi tạo một hàng đợi rỗng: First := 1, Last := 0;

Last

Phộp toỏn Push Phộp toỏn Pop

o Để thờm một phần tử vào hàng đợi ta tăng Last lờn 1 và đưa giỏ trị đú vào phần tử thứ Last.

o Để loại một phần tử khỏi hàng đợi, ta lấy giỏ trị ở vị trớ First và tăng giỏ trị này lờn 1.

o Khi tăng Last lờn hết khoảng chỉ số của mảng thỡ mảng đầy, khụng thể thờm nữa.

o Khi First > Last tức là hàng đợi đang rỗng.

Như vậy chỉ những phần tử của mảng từ vị trớ First tới vị trớ Last được sử dụng làm hàng đợi.

Program QueueByArray; Const max = 10000;

Var

Queue : Array[1..max] of Integer; First, Last : Integer;

Procedure QueueInit; {khoi tao hang doi rong}

Begin

First:=1; Last := 0;

End;

Procedure Push(v:integer);{dua gia tri v vao Queue}

Begin

If Last = max then

Write('Queue da day !') Else Begin Inc(Last); Queue[Last] := V; End; End; Function Pop:integer; Begin

If First > Last then

Write('Queue rong !')

Begin Pop := Queue[First]; Inc( First); End; End; <...>

Để ý ta thấy khi cài đặt một Stack bằng một mảng cú kớch thước tối đa là 10000 phần tử thỡ khi ta thực hiện 6000 lần Push rồi 6000 lần Pop, sau đú lai thực hiện 6000 lần Push thỡ vẫn khụng cú lỗi xảy ra, lý do là chỉ số Last lưu đỉnh của Stack được tăng lờn 6000 rồi lại giảm về 0 rồi lại tăng lờn 6000. Nhưng đối với cỏch cài đặt Queue như trờn thỡ mỏy sẽ bỏo lỗi tràn mảng bởi mỗi lần Push, chỉ số cuối hàng đợi Last cũng tăng lờn mà khụng bao giờ giảm. Đú chớnh là một điểm chỳ ý khi cài đặt và thao tỏc với hàng đợi, chỉ cú cỏc phần tử từ vị trớ First tới vị trớ Last là cú nghĩa cũn cỏc phần tử từ 1 tới First - 1 là vụ nghĩa.

Để khắc phục điều này người ta mụ tả hàng đợi bằng một danh sỏch vũng: Coi như cỏc phần tử của mảng được xếp xung quang một vũng trũn theo chiều kim đồng hồ. Cỏc phần tử nằm trờn cung trũn từ vị trớ First đến vị trớ Last là cỏc thành phần của Queue và cú thờm một biến n để lưu số phần tử của Queue. Việc thờm phần tử vào Queue tương đương với việc ta dịch chỉ số Last theo chiều kim đồng hồ một vị trớ rồi đặt giỏ trị mới vào đú. Việc loại bỏ một phần tử trong Queue tương đương với việc lấy ra phần tử tại vị trớ First rồi dịch First theo chiều kim đồng hồ một vị trớ.

Last

Lưu ý là trong thao tỏc Push và Pop phải kiểm tra Queue tràn hay Queue rỗng nờn phải cập nhật lại biến n. (Thực ra ở đõy dựng thờm biến n

cho dễ hiểu chứ thực tế chỉ cần hai biến Last và First là ta cú thể kiểm tra được Queue tràn hay cạn rồi.)

Program QueueByCircleList; Const max = 10000;

Var

Queue : Array[1..max] of Integer; I, n, First, Last : Integer;

Procedure QueueInit; {khoi tao hang doi rong}

Begin

First:=1; Last := 0; N:=0;

End;

Procedure Push(v:integer);{dua gia tri v vao Queue} Var NewLast: Integer; Begin If n = max then Write('Queue da day !') Else Begin

If Last = Max then

Last := 1 else inc(Last); Queue[Last] := V; Inc(n); {n := n +1 } End; End; Function Pop:integer; Begin If n=0 then Write('Queue rong !')

Else

Begin

Pop := Queue[First];

If First = max then First := 1 Else Inc( First);

Dec(n);

End;

End;

< . . . >

b) Cài đặt Hàng đợi bằng Danh sỏch liờn kết đơn kiểu FIFO

Tương tự như cài đặt Stack bằng danh sỏch nối đơn kiểu LIFO (giả sử khụng gian bộ nhớ đủ để cấp phỏt cho cỏc thành phần mới được đưa vào hàng đợi), nờn ta cũng khụng cần kiểm tra Hàng đợi tràn trong trường hợp mụ tả Hàng đợi bằng danh sỏch nối đơn kiểu FIFO. Điốu kiện để hàng đợi rỗng là Queue.First = Nil.

Cỏc thủ tục và hàm thực hiện cỏc phộp toỏm trờn Hàng đợi được mụ tả như sau:

Program QueueByLinkedList;

Type

PNode = ^TNode;{kieu con tro tro toi mot nut cua DS} TNode = Record {Cau truc mot nut cua DS}

Value: Integer; Link: PNode;

End;

Var

First, Last: PNode;

{Hai con tro tro toi nut dau va nut cuoi cua DS} . . . . .

Procedure QueueInit; {Khoi tao Queue rong}

Begin

First := Nil

End;

Function Empty:Boolean; {Kiem tra Queue rong}

Begin

If First = Nil then Empty := True

Else Empty := False;

End;

Procedure Push(V: Integer); {Dua gia tri V vao Queue}

Var

P: PNode;

Begin

New(p);

P^.Value := V; {tao ra mot nut moi} P^.Link := Nil;

If First := Nil Then First := P {Moc nut do vao DS}

Else Last^.Link := P; Last := P;

{Nut moi tro thanh nut cuoi va cap nhat lai con tro Last}

End;

Function Pop: Integer;

Var

P: PNode;

Begin

If First := Nil then Write('Queue is Empty !')

Else

Begin

P := First^.Link;

{Giu lai nut tiep theo First^ - Nut duoc day vao DS ngay sau First^}

Dispose(First);{Giai phong bo nho cap cho First^}

First := P; {Cap nhat lai First moi}

End;

End;

< . . . >

TểM TẮT

Trong chương này chỳng ta đó nghiờn cứu một kiểu Dữ liệu mới - Danh sỏch, một trong những mụ hỡnh dữ liệu quan trọng nhất, được sử dụng thường xuyờn trong cỏc thuật toỏn. Cú rất nhiều cỏch, nhiều phương phỏp khỏc nhau để cài đặt một danh sỏch, tương ứng với mỗi cỏch cài đặt lại cú cỏc phộp toỏn riờng. Tại mỗi phương phỏp cài đặt chỳng tụi đều phõn tớch và đưa ra cỏc phộp toỏn tương ứng, cú vớ dụ, hỡnh vẽ minh hoạ kốm theo. Cỏc phộp toỏn cơ bản đều cú đoạn chương trỡnh mẫu hướng dẫn và giải thớch cụ thể.

Trong Kiểu dữ liệu danh sỏch cú hai kiểu dữ liệu trừu tượng đặc biệt quan trọng là Ngăn xếp (Stack) và hàng đợi (Queue). Là một cấu trỳc dữ liệu được dựng khỏ phổ biến trong thiết kế giải thuật. Bất kỳ nơi nào ta cần quản lý dữ liệu, quỏ trỡnh... theo kiểu vào sau - ra trước hay vào trước-ra trước đều cú thể ứng dụng ngăn xếp hay hàng đợi.

Vớ dụ rất dễ thấy là quản lý in trờn mạng, nhiều mỏy tớnh yờu cầu in đồng thời và ngay cả một mỏy tớnh cũng yờu cầu in nhiều lần. Núi chung cú nhiều yờu cầu in dữ liệu, nhưng mỏy in khụng thể đỏp ứng tức thời tất cả cỏc yờu cầu đú nờn chương trỡnh quản lý in sẽ thiết lập một hàng đợi để quản lý cỏc yờu cầu. Yờu cầu nào mà chương trỡnh quản lý in nhận trước nú sẽ giải quyết trước.

Một vớ dụ khỏc là duyệt cõy theo mức được trỡnh bày chi tiết trong chương sau. Cỏc giải thuật duyệt theo chiều rộng một đồ thị cú hướng hoặc vụ hướng cũng dựng hàng đợi để quản lý cỏc nỳt đồ thị.

Một phần của tài liệu giáo trình cấu trúc dữ liệu (Trang 56 - 63)

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

(104 trang)
w