NG Đ I
(Font: Courier New)
Cũng nh ngăn x p, hàng đ i là CTDL tuy n tính. Hàng đ iư ế ế
là m t danh sách các đ i t ng, m t đ u c a danh sách đ c ượ ượ
xem là đ u hàng đ i, còn đ u kia c a danh sách đ c xem là ượ
đuôi hàng đ i. V i hàng đ i, chúng ta ch có th xen m t đ i
t ng m i vào đuôi hàng và lo i đ i t ng đ u hàng raượ ượ
kh i hàng. Trong ch ng này chúng ta s nghiên c u các ươ
ph ng pháp cài đ t hàng đ i và trình bày m t s ng d ngươ
c a hàng đ i.
1, KI U D LI U TR U T NG HÀNG Đ I ƯỢ
Trong m c này chúng ta s đ c t KDLTT hàng đ i. Chúng
ta có th xem m t hàng ng i đ ng x p hàng ch đ c ph c v ườ ế ượ
(ch ng h n, x p hàng ch mua vé tàu, x p hàng ch giao d ch ế ế
ngân hàng, …) là m t hàng đ i, b i vì ng i ra kh i hàng ườ
và đ c ph c v là ng i đ ng đ u hàng, còn ng i m i đ nượ ườ ườ ế
s đ ng vào đuôi hàng.
Hàng đ i là m t danh sách các đ i t ng d li u, m t ượ
trong hai đ u danh sách đ c xem là đ u hàng, còn đ u kia ượ
là đuôi hàng. Ch ng h n, hàng đ i có th là danh sách các
ký t (a, b, c, d), trong đó a đ ng đ u hàng, còn d đ ng
đuôi hàng. Chúng ta có th th c hi n các phép toán sau
đây trên hàng đ i, trong các phép toán đó Q là m t hàng
đ i, còn x là m t đ i t ng cùng ki u v i các đ i t ng ượ ượ
trong hàng Q.
1. Empty(Q). Hàm tr v true n u hàng Q r ng và false ế
n u không.ế
2. Enqueue(x, Q). Thêm đ i t ng x vào đuôi hàng Q. ượ
3. Dequeue(Q). Lo i đ i t ng đ ng đ u hàng Q. ượ
4. GetHead(Q). Hàm tr v đ i t ng đ ng đ u hàng Q, ượ
còn hàng Q thì không thay đ i.
Ví d .
N u Q = (a, b, c, d) và a đ u hàng, d đuôi hàng, thìế
khi th c hi n phép toán Enqueue(e, Q) ta nh n đ c Q = (a, ượ
b, c, d, e), v i e đ ng đuôi hàng, n u sau đó th c hi n ế
phép toán Dequeue(Q), ta s có Q = (b, c, d, e) và b tr
thành ph n t đ ng đ u hàng.
V i các phép toán Enqueue và Dequeue xác đ nh nh trên ư
thì đ i t ng vào hàng tr c s ra kh i hàng tr c. Vì lý ượ ướ ướ
do đó mà hàng đ i đ c g i là c u trúc d li u FIFO (vi t ượ ế
t t c a c m t First- In First- Out). Đi u này đ i l p v i
ngăn x p, trong ngăn x p đ i t ng ra kh i ngăn x p là đ iế ế ượ ế
t ng sau cùng đ c đ t vào ngăn x p.ượ ượ ế
Hàng đ i s đ c s d ng trong b t kỳ hoàn c nh nào mà ượ
chúng ta c n x lý các đ i t ng theo trình t FIFO. Cu i ượ
ch ng này chúng ta s trình bày m t ng d ng c a hàng đ iươ
trong mô ph ng m t h ph c v . Nh ng tr c h t chúng ta c n ư ướ ế
nghiên c u các ph ng pháp cài đ t hàng đ i. Cũng nh ngăn ươ ư
x p, chúng ta có th cài đ t hàng đ i b i m ng ho c b iế
DSLK.
2, CÀI Đ T HÀNG Đ I B I M NG
Cũng nh ngăn x p, chúng ta có th cài đ t hàng đ i b iư ế
m ng. Song cài đ t hàng đ i b i m ng s ph c t p h n ngăn ơ
x p. Nh l i r ng, khi cài đ t danh sách (ho c ngăn x p)ế ế
b i m ng thì các ph n t c a danh sách (ho c ngăn x p) s ế
đ c l u trong đo n đ u c a m ng, còn đo n sau c a m ng làượ ư
không gian ch a s d ng đ n. Chúng ta có th làm nh thư ế ư ế
v i hàng đ i đ c không? Câu tr l i là có, nh ng không ượ ư
hi u qu . Gi s chúng ta s d ng m ng element đ l u các ư
ph n t c a hàng đ i, các ph n t c a hàng đ i đ c l u ượ ư
trong các thành ph n m ng element[0], element[1],…,
element[k] nh trong hình 1a. V i cách này, ph n t đ uư
hàng luôn luôn đ c l u trong thành ph n m ng element[0],ượ ư
còn ph n t đuôi hàng đ c l u trong element[k], và do đó ượ ư
ngoài m ng element ta ch c n m t bi n tail ghi l i ch s ế
k. Đ thêm ph n t m i vào đuôi hàng, ta ch c n tăng ch s
tail lên 1 và đ t ph n t m i vào thành ph n m ng
element[tail]. Song n u mu n lo i ph n t đ u hàng, chúngế
ta c n chuy n lên trên m t v trí t t c các ph n t đ c ượ
l u trong element[1],…, element[tail] và gi m ch s tail điư
1, và nh v y tiêu t n nhi u th i gian.ư
===========================================================
====
element
0 1 2 3 4
SIZE – 1
tail
(a)
element
0 1 2 3 4 5 6
SIZE – 1
head tail
(b)
6
7
5 0
8
4
9
3
2
1
0 SIZE – 1
head
tail
(c)
===========================================================
====
Hình 1: Các ph ng pháp cài đ t hàng đ iươ
b i m ng
Đ kh c ph c nh c đi m c a ph ng pháp trên, chúng ta ượ ươ
l u các ph n t c a hàng đ i trong m t đo n con c a m ng tư
ch s đ u head t i ch s đuôi tail, t c là các ph n t c a
hàng đ i đ c l u trong các thành ph n m ng element[head], ượ ư
element[head + 1], … , element[tail], nh trong hình 7.1b.ư
V i cách cài đ t này, ngoài m ng element, chúng ta c n s
d ng hai bi n: bi n ch s đ u head và bi n ch s đuôi ế ế ế
tail. Đ lo i ph n t đ u hàng chúng ta ch c n tăng ch
s head lên 1. Chúng ta có nh n xét răng, khi thêm ph n t
m i vào đuôi hàng thì ch s tail tăng, khi lo i ph n t
đ u hàng thì ch s head tăng, t i m t th i đi m nào đó hàng
đ i s chi m đo n cu i c a m ng, t c là bi n tail nh n giá ế ế
tr SIZE – 1 ( SIZE là c c a m ng). Lúc đó ta không th
thêm ph n t m i vào đuôi hàng, m c d u không gian ch a s ư
d ng trong m ng, đo n đ u c a m ng t ch s 0 t i head – 1,
có th còn r t l n! Đ gi i quy t v n đ này, chúng ta ế
“cu n” m ng thành vòng tròn, nh đ c minh ho trong hình ư ượ
7.1c. Trong m ng vòng tròn, chúng ta xem thành ph n ti p ế
theo thành ph n element[SIZE - 1] là thành ph n element[0].
V i m ng vòng tròn, khi thêm ph n t m i vào đuôi hàng, n u ế
ch s tail có giá tr là SIZE – 1, ta đ t tail = 0 và l u ư
ph n t m i trong thành ph n m ng element[0]. T ng t khi ươ
ph n t đ u hàng đ c l u trong element[SIZE - 1], thì đ ượ ư
lo i nó, ta ch c n đ t head = 0. Do đó, n u cài đ t hàng ế
đ i b i m ng vòng tròn, thì phép toán thêm ph n t m i vào
đuôi hàng không th c hi n đ c ch khi m ng th c s đ y, t c ượ
là khi trong m ng không còn thành ph n nào ch a s d ng. ư
Sau đây chúng ta s nghiên c u s cài đ t hàng đ i b i
m ng vòng tròn. KDLTT hàng đ i s đ c cài đ t b i l p ượ
Queue, đây là l p khuôn ph thu c tham bi n ki u Item, ế
trong đó Item là ki u c a các ph n t trong hàng đ i. L p
Queue ch a các bi n thành ph n nào? Các ph n t c a hàng ế
đ i đ c l u trong m ng vòng tròn đ c c p phát đ ng, do đó ượ ư ượ
c n có bi n con tr element tr t i thành ph n đ u tiên c a ế
m ng đó, bi n size l u c c a m ng, bi n ch s đ u head và ế ư ế
bi n ch s đuôi tail. Ngoài các bi n trên, chúng ta thêmế ế
vào m t bi n length đ l u đ dài c a hàng đ i (t c là s ế ư
ph n t trong hàng đ i). L p Queue đ c đ nh nghĩa nh trong ượ ư
hình 7.2.
Code:
template <class Item>
class Queue
{
public :
Queue (int m = 1);
// Hàm ki n t o hàng đ i r ng v i dung l ng là m,ế ượ
// m nguyên d ng (t c là c m ng đ ng là m).ươ
Queue (const Queue & Q) ;
// Hàm ki n t o copy.ế
~ Queue( ) // Hàm hu .
{ delete [ ] element ; }
Queue & operator = (const Queue & Q); // Toán t gán.