Chương 2 Cấu trúc dữ liệu và giải thuật | Công nghệ phần mềm | Học viện Nông nghiệp Việt Nam

Bài giảng này tập trung vào cấu trúc dữ liệu và giải thuật, bao gồm mảng, danh sách, ngăn xếp và hàng đợi. Nó cung cấp kiến thức về tổ chức, cấu trúc lưu trữ và các phép toán liên quan đến từng cấu trúc dữ liệu.

1
CHƯƠNG 2
MNG DANH CH
1. Mng
Mng mt tp hp th t gm mt s c
định các phn t cùng kiu.
Mi phn t mảng được ch ra bi ch s, th
hin th t ca phn t trong mảng. Điều này
cho phép truy nhp trc tiếp phn t qua ch s.
Các phn t ca mng có th t chc thành
mng 1 chiu, 2 chiu, 3 chiu… Mng 1 chiu
1 ch s, mng 2 chiu có 2 ch s, mảng
n chiu có n ch s.
1
2
Tìm hiu mt cu trúc d liu
Đặc đim, t chc
Cu trúc lưu tr
Phép toán
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.1
2
1. Mng
2
3
n
k = (i-1)*n + j
4 5 9
7 10 1
a13 => V[k],
k = (1-1)*3 + 3 = 3
V
k 1
2
3 4
5
6
3
x
x
x
x
4
5
9
7
10
1
4
1. Mng
Mng ch dùng đưc cu trúc u tr kế tiếp,
để cho phép truy nhp trc tiếp các phn t.
Dùng vec u tr V n ô nh liên tiếp vi
ch s t 1 đến n để lưu trữ các phn t d
liu ca mng.
Vi mng 1 chiu, phn t a
i
đưc lưu tr
ô nh V[i]
Vi mng 2 chiu, các phn t được lưu trữ
ln t, hết hàng 1 đến hàng 2… Phn t a
ij
đưc u trữ ô nh V[k], k = (i-1)*n + j, n
s phn t trên hàng.
3
2. Danh ch
Khái nim
Danh ch mt tp hp th t gm mt
s biến đng các phn tng kiu.
Ví d: Tp hợp người đến khám bnh cho ta
mt danh sách. Ngưi đến xếp hàng khám b
sung phía sau, ngưi đưc khám s ra khi
ng ( loi b ) phía trưc.
5
6
1. Mng
các phép to lp mng, tìm kiếm 1 phn
t t mng, truy nhp mt phn t mng.
Không phép b sung loi b mt phn
t mng.
4
2.1. Khái nim
n là độ dài (kích thước) ca danh sách, n th
thay đổi.
Mt phn t trong danh sách thưng mt bn
ghi (gm mt hoc nhiều trưng).
d 1: Danh mc đin thoi mt danh sách
tuyến nh, mi phn t ca là mt thuê bao
gồm 3 trưng: H tên ch hộ, địa ch, s đin
thoi.
d 2: Tp(File) là mt danh sách kích
thước lớn được lưu tr b nh ngoài.
7
8
2.1. Khái nim
Danh ch tuyến tính là danh sách mà mi quan
h ln cn gia các phn t được xác định
ràng. Ví dụ: Véc tơ là một danh sách tuyến tính.
Danh sách tuyến tính dng (a
1
, a
2
, ..., a
n
),
trong đó a
1
phn t đầu, a
n
phn t cui,
phn t th i a
i
. Vi a
i
bt k 1 i n t a
i+1
gi phn t sau a
i
; 2 i n thì phn t a
i-1
phn t trưc ca a
i
.
Danhch th rng (không phn to).
5
2.3. Các phép toán trên danh sách
Danhch luôn phép toán b sung, loi b
phn t d liu.
Phép b sung: th b sung phn t vào
danh sách.
Phép loi b: th loi b mt phàn t ra khi
danh sách.
Phép ghép: th ghép hai hay nhiu danh
sách thành mt danh sách.
Phép tách: th tách mt danh sách thành
nhiu danh sách.
Phép cp nht: cp nht giá tr cho các phn t
ca danh sách.
9
10
2.2. u tr kế tiếp cho danh sách
tuyến tính
Danh sách th s dng cu trúc u trữ kế
tiếp hoc phân tán.
6
3. Cu trúc ngăn xếp (Stack)
3.1. Định nghĩa
Ngăn xếp là mt loi danh sách tuyến tính đặc
bit phép b sung phép loi b luôn luôn
thc hin mt đu gọi là đỉnh (Top).
Phép b sung loi b phn t ca ngăn xếp
đưc thc hin theo nguyên tắc ‘Vào sau ra
trước’ (Last in - First out, viết tt là LIFO).
Ngăn xếp th rng.
11
12
2.3. Các phép toán trên danh sách
Phép sao chép: th sao chép mt danh sách.
Phép sp xếp: Có th sp xếp các phn t ca
danh sách theo mt th t nhất định.
Phép tìm kiếm: Tìm kiếm trong danh sách mt
phn t mt trường nào đó giá tr n định.
Ví d 1: Minh ho cho các phép toán trên danh
sách đưc cài đặt trên mng. Cho danh sách các
s ngun, thêm vào 1 s nguyên và loi b mt
s ngun.
7
3.3. Các phép toán trên ngăn xếp
B sung mt phn t vào stack
Vào: ngăn xếp (S,T), phn t x
Ra: không có
{Th tc này b sung phn t x vào ngăn
xếp đưc lưu tr bi véc S ch thước
là n, có ch s đỉnh là T.}
13
14
3.2. Ngăn xếp lưu tr kế tiếp
Dùng vector lưu trữ S có n ô nh kế tiếp nhau
vi ch s t 1 đến n đ uc phn t d liu.
Dùng biến T cha ch s phn t đỉnh của ngăn
xếp. T s có giá tr thay đổi khi ngăn xếp hot
động. Khi b sung 1 phn t T s tăngn 1. Khi
loi b 1 phn t thì T giảm đi 1.
Khi ngăn xếp rng T=0.
8
3.3. Các phép toán trên ngăn xếp
Loi b mt phn t ra khi stack
Vào: Ngăn xếp (S, T)
Ra: giá tr phn t loi b nh)
{Hàm này thc hin vic loi b phn t
đỉnh ngăn xếp (S,T) tr v phn t này.}
15
16
Th tc b sung mt phn t vào stack
Procedure push(Var S, T; x)
1) {Kim tra đầy}
If T = n then Begin Write(‘Ngăn xếp đã đầy‘)
Return
End;
2) {Tăng Tn 1}
T := T+1;
3) {Đưa x vào ngăn xếp ti v trí T}
S[T] := x;
Return
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 03
3.15
9
Hàm kim tra ngăn xếp rng/ đy
Function isEmpty(S,T)
If T = 0 then isEmpty := TRUE
Else isEmpty := FALSE;
Return
Function isFull(S,T)
If T = n then isFull := TRUE
Else isFull := FALSE;
Return
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
2.18
17
18
Hàm loi b phn t khi ngăn xếp
Function pop(Var S, T)
1) {Kim tra rng}
If T = 0 then Begin
Write(‘Ngăn xếp rỗng‘)
Return;
End
2) tg := S[T]; {Lưu li phn t đỉnh}
3) {Gim T đi 1}
T := T-1
4) {Tr v phn t đỉnh đã loi}
pop := tg;
Return
Ngô Công Thng Bài ging Cu trúc d liu gii thut - Chương 02 2.17
10
Cài đặt cu trúc d liu
Khi cài đt mt cu trúc d liu ta cài đt
nhng gì?
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.20
19
20
Hàm tr v phn t đỉnh ngăn xếp
Function top(S,T)
1) {Kim tra rng}
If T = 0 then Begin
Write(‘Ngăn xếp rỗng‘)
Return;
End
2) {Tr v phn t đỉnh}
top := S[T];
Return
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
2.19
11
Ví d v ng dng ca ngăn xếp
(ctdlgt-nganxep1.cpp): Cài đt cu trúc d liu
ngăn xếp lưu trữ kế tiếp phn t là s
nguyên. ng dng ngăn xếp đã cài đt cho bài
toán chuyển đổi s nguyên h 10 sang h 2.
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.22
21
22
Cài đặt cu trúc d liu
Cu trúc d liu + Gii thut = Chương trình
Cu trúc lưu tr Phép toán
(1) (2)
Cài đt (Lp trình)
Cài đặt cu trúc lưu tr: Khai báo biến và
khi to giá tr ban đầu cho biến (nếu cn)
Cài đt phép toán: Khai báo đnh nghĩa
m, mi hàm là mt pp toán
Ngô Công Thng
Bài ging Cu trúc d liu gii thut 2 - Chương 01
1.21
12
Bài tp
ng dụng ngăn xếp chuyn biu thc
trung t hành hu t. Biết rng biếu thc
trung t có du ngoặc đy đ.
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.24
23
24
Ví d v ng dng ca ngăn xếp
o: n
Ra: s nh phân
Procedure chuyen_doi (n);
While n<> 0 do Begin
R:=n mod 2
Call Push(S,T,R);
n= n div 2
End;
While S<>NULL do Begin
R:=POP(S,T); {lay R tu dinh T cua Stack S }
Write(R)
End;
Return;
Ngô Công Thng Bài ging Cu trúc d liu gii thut - Chương 02
3.23
13
4.2. Hàng đợi lưu tr kế tiếp
Dùng vector lưu tr Q n ô nh kế tiếp vi ch
s t 1 đến n để lưu tr các phn t d liu ca
hàng đợi.
Dùng biến F cha ch s phn t đầu hàng (li
trước), biến R cha ch s phn t cuing (li
sau). F (Front), R (Rear).
Khi b sung 1 phn t vào hàng đợi thì R s
tăng lên 1, còn khi loại b mt phn t khi
hàng đợi thì F tăng lên 1.
Khi hàng đợi rng thì R=F=0.
25
26
4. Cu trúc ng đợi (Queue)
4.1. Định nghĩa
Hàng đợi (queue) là loi danh sách tuyến tính
đặc bit phép b sung đưc thc hin mt
đầu, gi là li sau (rear) và phép loi b thc
hin mt đu khác, gi là lối trưc (front).
Phép b sung loi b phn t ca hàng đợi
đưc thc hin theo nguyên tắc vào trước ra
trước (First in - First out, viết tt là FIFO).
Hàng đợi th rng.
14
4.2. Hàng đợi lưu tr kế tiếp
Q
1 2
3
F
4 5
n-1 n
R
4.2. Hàng đợi lưu tr kế tiếp
Trong cấu trúc lưu trữ kế tiếp ca hàng đợi
ngưi ta s dng ô nh theo kiu quay vòng để
s dng li các ô nh cha các phn t d liu
đã loại b, tc là tiếp theo ô nh n là ô nh 1.
Q
x x x x x x x x
1 2 3 n
F R
x
x
x
x
x
x
27
28
15
4.3. Các phép toán trên Queue
B sung mt phn t vào queue
Vào: (Q, F, R), x
Ra: Không có
{Th tc này b sung phn t x vào hàng
đợi lưu tr bi vector Q n ô nh theo
kiu vòng tròn, có biến ch s F, R.}
29
30
4.2. Hàng đợi lưu tr kế tiếp
16
Trường hp hàng đợi đy
Q
1 2
R
3
F
n
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.31
Procedure CQInsert (Var Q,F,R; x)
1) {Kim tra đầy}
If (F=1)and(R=n) or (R+1=F) then Begin
Write( ‘Hàng đợi đã đầy‘);
Return;
End;
2) {Tăng R lên 1}
If F=R=0 Then F := R :=1
Else If R=n Then R := 1
Else R := R+1;
3. ưa x vào hàng đi ti v trí R}
Q[R] := x;
Return
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.32
x
x
x
x
x
x
x
x
31
32
17
Th tc loi b phn t khi hàng đợi
Function CQDelete(Var Q,F,R)
1) {Kim tra rng}
If F=R=0 then Begin
Write(‘Hàng đợi đã rỗng’);
Return;
End;
2) {Lưu li phn t loi b}
tg:=Q[F];
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.34
33
34
4.3. Các phép toán trên hàng đi
Loi b phn t ra khi hàng đợi
- Vào: Hàng đi (Q,F,R)
- Ra: Tr v phn t loi b
{Hàm này loi b phn t lối trước ca
hàng đi (Q,F,R) tr v phn t loi b}
18
Phép toán kim tra hàng đi rng
Vào: (Q,F,R)
Ra: TRUE nếu rng còn không FALSE
Function CQIsEmpty(Q,F,R)
If F=R=0 then CQIsEmpty:=True
Else CQIsEmpty:=False;
Return
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.36
35
36
Th tc loi b phn t khi hàng đợi
Function CQDelete(Var Q,F,R)
3) {Tăng F lên 1}
If F=R then F:=R:=0
Else If F=n then F:=1
Else F:=F+1;
4) CQDelete:=tg;
Return
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.35
19
37
i tp
Cài đặt cu trúc d liu hàng đợi lưu tr kế
tiếp có phn t d liu là s nguyên. ng
dụng hàng đợi cho bài tn: Đc dãy s
nguyên dương t tệp văn bn
‘daysonguyen.txt, trên tp không có thông
tin v s ng s, tách thành dãy s l
dãy s chn theo đúng th t xut hin trên
tp, đưa 2 dãy s ra màn hình.
Ngô Công Thng
Bài ging Cu trúc d liu gii thut - Chương 02
3.37
| 1/19

Preview text:


Tìm hiểu một cấu trúc dữ liệu Đặc điểm, tổ chức Cấu trúc lưu trữ Phép toán Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.1 1 CHƯƠNG 2 MẢNG VÀ DANH SÁCH 1. Mảng
Mảng là một tập hợp có thứ tự gồm một số cố
định các phần tử cùng kiểu.
Mỗi phần tử mảng được chỉ ra bởi chỉ số, thể
hiện thứ tự của phần tử trong mảng. Điều này
cho phép truy nhập trực tiếp phần tử qua chỉ số.
Các phần tử của mảng có thể tổ chức thành
mảng 1 chiều, 2 chiều, 3 chiều… Mảng 1 chiều
có 1 chỉ số, mảng 2 chiều có 2 chỉ số, … mảng n chiều có n chỉ số. 2 1 1. Mảng
Mảng chỉ dùng được cấu trúc lưu trữ kế tiếp,
để cho phép truy nhập trực tiếp các phần tử.
Dùng vec tơ lưu trữ V có n ô nhớ liên tiếp với
chỉ số từ 1 đến n để lưu trữ các phần tử dữ liệu của mảng.
Với mảng 1 chiều, phần tử a được lưu trữ ở i ô nhớ V[i]
Với mảng 2 chiều, các phần tử được lưu trữ
lần lượt, hết hàng 1 đến hàng 2… Phần tử aij
được lưu trữ ở ô nhớ V[k], k = (i-1)*n + j, n là số phần tử trên hàng. 3 1. Mảng V x x x x k 1 2 3 n k = (i-1)*n + j 4 5 9 a13 => V[k], 7 10 1 k = (1-1)*3 + 3 = 3 V 4 5 9 7 10 1 k 1 2 3 4 5 6 4 2 1. Mảng
Có các phép tạo lập mảng, tìm kiếm 1 phần
tử từ mảng, truy nhập một phần tử mảng.
Không có phép bổ sung và loại bỏ một phần tử mảng. 5 2. Danh sách Khái niệm
Danh sách là một tập hợp có thứ tự gồm một
số biến động các phần tử cùng kiểu.
Ví dụ: Tập hợp người đến khám bệnh cho ta
một danh sách. Người đến xếp hàng khám bổ
sung ở phía sau, người được khám sẽ ra khỏi
hàng ( loại bỏ ) ở phía trước. 6 3 2.1. Khái niệm
Danh sách tuyến tính là danh sách mà mối quan
hệ lận cận giữa các phần tử được xác định rõ
ràng. Ví dụ: Véc tơ là một danh sách tuyến tính.
Danh sách tuyến tính có dạng (a , a , ..., a ), 1 2 n
trong đó a là phần tử đầu, a là phần tử cuối, 1 n
phần tử thứ i là a . Với a bất kỳ 1  i i i  n thì ai+1
gọi là phần tử sau a ; 2  là i
i  n thì phần tử ai-1
phần tử trước của a . i
Danh sách có thể rỗng (không có phần tử nào). 7 2.1. Khái niệm
n là độ dài (kích thước) của danh sách, n có thể thay đổi.
Một phần tử trong danh sách thường là một bản
ghi (gồm một hoặc nhiều trường).
Ví dụ 1: Danh mục điện thoại là một danh sách
tuyến tính, mỗi phần tử của nó là một thuê bao
gồm 3 trường: Họ tên chủ hộ, địa chỉ, số điện thoại.
Ví dụ 2: Tệp(File) là một danh sách có kích
thước lớn được lưu trữ ở bộ nhớ ngoài. 8 4
2.2. Lưu trữ kế tiếp cho danh sách tuyến tính
Danh sách có thể sử dụng cấu trúc lưu trữ kế tiếp hoặc phân tán. 9
2.3. Các phép toán trên danh sách
Danh sách luôn có phép toán bổ sung, loại bỏ phần tử dữ liệu.
Phép bổ sung: Có thể bổ sung phần tử vào danh sách.
Phép loại bỏ: có thể loại bỏ một phàn tử ra khỏi danh sách.
Phép ghép: có thể ghép hai hay nhiều danh
sách thành một danh sách.
Phép tách: có thể tách một danh sách thành nhiều danh sách.
Phép cập nhật: cập nhật giá trị cho các phần tử của danh sách. 10 5
2.3. Các phép toán trên danh sách
Phép sao chép: có thể sao chép một danh sách.
Phép sắp xếp: Có thể sắp xếp các phần tử của
danh sách theo một thứ tự nhất định.
Phép tìm kiếm: Tìm kiếm trong danh sách một
phần tử mà một trường nào đó có giá trị ấn định.
Ví dụ 1: Minh hoạ cho các phép toán trên danh
sách được cài đặt trên mảng. Cho danh sách các
số nguyên, thêm vào 1 số nguyên và loại bỏ một số nguyên. 11
3. Cấu trúc ngăn xếp (Stack) 3.1. Định nghĩa
Ngăn xếp là một loại danh sách tuyến tính đặc
biệt mà phép bổ sung và phép loại bỏ luôn luôn
thực hiện ở một đầu gọi là đỉnh (Top).
Phép bổ sung và loại bỏ phần tử của ngăn xếp
được thực hiện theo nguyên tắc ‘Vào sau ra
trước’ (Last in - First out, viết tắt là LIFO). Ngăn xếp có thể rỗng. 12 6
3.2. Ngăn xếp lưu trữ kế tiếp
Dùng vector lưu trữ S có n ô nhớ kế tiếp nhau
với chỉ số từ 1 đến n để lưu các phần tử dữ liệu.
Dùng biến T chứa chỉ số phần tử đỉnh của ngăn
xếp. T sẽ có giá trị thay đổi khi ngăn xếp hoạt
động. Khi bổ sung 1 phần tử T sẽ tăng lên 1. Khi
loại bỏ 1 phần tử thì T giảm đi 1. Khi ngăn xếp rỗng T=0. 13
3.3. Các phép toán trên ngăn xếp
Bổ sung một phần tử vào stack
Vào: ngăn xếp (S,T), phần tử x Ra: không có
{Thủ tục này bổ sung phần tử x vào ngăn
xếp được lưu trữ bởi véc tơ S có kích thước
là n, có chỉ số đỉnh là T.} 14 7
Thủ tục bổ sung một phần tử vào stack Procedure push(Var S, T; x) 1) {Kiểm tra đầy}
If T = n then Begin Write(‘Ngăn xếp đã đầy‘) Return End; 2) {Tăng T lên 1} T := T+1;
3) {Đưa x vào ngăn xếp tại vị trí T} S[T] := x; Return Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03 3.15 15
3.3. Các phép toán trên ngăn xếp
Loại bỏ một phần tử ra khỏi stack Vào: Ngăn xếp (S, T)
Ra: giá trị phần tử loại bỏ (đỉnh)
{Hàm này thực hiện việc loại bỏ phần tử ở
đỉnh ngăn xếp (S,T) và trả về phần tử này.} 16 8
Hàm loại bỏ phần tử khỏi ngăn xếp Function pop(Var S, T) 1) {Kiểm tra rỗng} If T = 0 then Begin
Write(‘Ngăn xếp rỗng‘) Return; End
2) tg := S[T]; {Lưu lại phần tử đỉnh} 3) {Giảm T đi 1} T := T-1
4) {Trả về phần tử đỉnh đã loại} pop := tg; Return Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 2.17 17
Hàm kiểm tra ngăn xếp rỗng/ đầy Function isEmpty(S,T) If T = 0 then isEmpty := TRUE Else isEmpty := FALSE; Return Function isFull(S,T) If T = n then isFull := TRUE Else isFull := FALSE; Return Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 2.18 18 9
Hàm trả về phần tử đỉnh ngăn xếp Function top(S,T) 1) {Kiểm tra rỗng} If T = 0 then Begin
Write(‘Ngăn xếp rỗng‘) Return; End
2) {Trả về phần tử đỉnh} top := S[T]; Return Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 2.19 19
Cài đặt cấu trúc dữ liệu
Khi cài đặt một cấu trúc dữ liệu ta cài đặt những gì? Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.20 20 10
Cài đặt cấu trúc dữ liệu
Cấu trúc dữ liệu + Giải thuật = Chương trình
Cấu trúc lưu trữ Phép toán (1) (2) Cài đặt (Lập trình)
Cài đặt cấu trúc lưu trữ: Khai báo biến và
khởi tạo giá trị ban đầu cho biến (nếu cần)
Cài đặt phép toán: Khai báo và định nghĩa
hàm, mỗi hàm là một phép toán Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật 2 - Chương 01 1.21 21
Ví dụ về ứng dụng của ngăn xếp
(ctdlgt-nganxep1.cpp): Cài đặt cấu trúc dữ liệu
ngăn xếp lưu trữ kế tiếp có phần tử là số
nguyên. Ứng dụng ngăn xếp đã cài đặt cho bài
toán chuyển đổi số nguyên hệ 10 sang hệ 2. Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.22 22 11
Ví dụ về ứng dụng của ngăn xếp Vào: n Ra: số nhị phân Procedure chuyen_doi (n); While n<> 0 do Begin R:=n mod 2 Call Push(S,T,R); n= n div 2 End; While S<>NULL do Begin
R:=POP(S,T); {lay R tu dinh T cua Stack S } Write(R) End; Return; Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.23 23 Bài tập
Ứng dụng ngăn xếp chuyển biểu thức
trung tố hành hậu tố. Biết rằng biếu thức
trung tố có dấu ngoặc đầy đủ. Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.24 24 12
4. Cấu trúc hàng đợi (Queue) 4.1. Định nghĩa
Hàng đợi (queue) là loại danh sách tuyến tính
đặc biệt mà phép bổ sung được thực hiện ở một
đầu, gọi là lối sau (rear) và phép loại bỏ thực
hiện ở một đầu khác, gọi là lối trước (front).
Phép bổ sung và loại bỏ phần tử của hàng đợi
được thực hiện theo nguyên tắc vào trước ra
trước (First in - First out, viết tắt là FIFO).
Hàng đợi có thể rỗng. 25
4.2. Hàng đợi lưu trữ kế tiếp
Dùng vector lưu trữ Q có n ô nhớ kế tiếp với chỉ
số từ 1 đến n để lưu trữ các phần tử dữ liệu của hàng đợi.
Dùng biến F chứa chỉ số phần tử đầu hàng (lối
trước), biến R chứa chỉ số phần tử cuối hàng (lối sau). F (Front), R (Rear).
Khi bổ sung 1 phần tử vào hàng đợi thì R sẽ
tăng lên 1, còn khi loại bỏ một phần tử khỏi
hàng đợi thì F tăng lên 1.
Khi hàng đợi rỗng thì R=F=0. 26 13
4.2. Hàng đợi lưu trữ kế tiếp Q x x x x x x 1 2 3 4 5 n-1 n F R 27
4.2. Hàng đợi lưu trữ kế tiếp
Trong cấu trúc lưu trữ kế tiếp của hàng đợi
người ta sử dụng ô nhớ theo kiểu quay vòng để
sử dụng lại các ô nhớ chứa các phần tử dữ liệu
đã loại bỏ, tức là tiếp theo ô nhớ n là ô nhớ 1. x x x x x x x x Q 1 2 3 n F R 28 14
4.2. Hàng đợi lưu trữ kế tiếp 29
4.3. Các phép toán trên Queue
Bổ sung một phần tử vào queue Vào: (Q, F, R), x Ra: Không có
{Thủ tục này bổ sung phần tử x vào hàng
đợi lưu trữ bởi vector Q có n ô nhớ theo
kiểu vòng tròn, có biến chỉ số F, R.} 30 15
Trường hợp hàng đợi đầy x x x x x x x x Q 1 2 3 n R F Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.31 31
Procedure CQInsert (Var Q,F,R; x) 1) {Kiểm tra đầy}
If (F=1)and(R=n) or (R+1=F) then Begin
Write( ‘Hàng đợi đã đầy‘); Return; End; 2) {Tăng R lên 1} If F=R=0 Then F := R :=1 Else If R=n Then R := 1 Else R := R+1;
3. {Đưa x vào hàng đợi tại vị trí R} Q[R] := x; Return Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.32 32 16
4.3. Các phép toán trên hàng đợi
Loại bỏ phần tử ra khỏi hàng đợi - Vào: Hàng đợi (Q,F,R)
- Ra: Trả về phần tử loại bỏ
{Hàm này loại bỏ phần tử ở lối trước của
hàng đợi (Q,F,R) và trả về phần tử loại bỏ} 33
Thủ tục loại bỏ phần tử khỏi hàng đợi Function CQDelete(Var Q,F,R) 1) {Kiểm tra rỗng} If F=R=0 then Begin
Write(‘Hàng đợi đã rỗng’); Return; End;
2) {Lưu lại phần tử loại bỏ} tg:=Q[F]; Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.34 34 17
Thủ tục loại bỏ phần tử khỏi hàng đợi Function CQDelete(Var Q,F,R) 3) {Tăng F lên 1} If F=R then F:=R:=0 Else If F=n then F:=1 Else F:=F+1; 4) CQDelete:=tg; Return Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.35 35
Phép toán kiểm tra hàng đợi rỗng Vào: (Q,F,R)
Ra: TRUE nếu rỗng còn không là FALSE Function CQIsEmpty(Q,F,R) If F=R=0 then CQIsEmpty:=True Else CQIsEmpty:=False; Return Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.36 36 18 Bài tập
Cài đặt cấu trúc dữ liệu hàng đợi lưu trữ kế
tiếp có phần tử dữ liệu là số nguyên. Ứng
dụng hàng đợi cho bài toán: Đọc dãy số
nguyên dương từ tệp văn bản
‘daysonguyen.txt’, trên tệp không có thông
tin về số lượng số, tách thành dãy số lẻ và
dãy số chẵn theo đúng thứ tự xuất hiện trên
tệp, đưa 2 dãy số ra màn hình. Ngô Công Thắng
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 02 3.37 37 19