Chương III Stack và Queue - Giáo trình Cấu trúc dữ liệu và giải thuật | Trường Đại học Bách khoa Hà Nội

Lưu trữ các trang web đã từng được duyệt trên Web browser Cài đặt thao tác Undo trong các phần mềm soạn thảo Lưu danh sách các lời gọi hàm trong Java Virtual Machine duyệt theo thứ tự giữa ta được biểu thức tiền tố. Tài liệu được sưu tầm, giúp bạn ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!

Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 1
Cutrúcd liuvàGiithut
Chương III:
Stack và Queue
Danh sách kiungănxếp - Stack
Stack
z Mtkiudanhsáchtuyến tính đặc
bit
z Phép b sung và phép loib tuân
th theo cơ chế “vào sau ra trước”
(last in first out) , đượcthchin
đầu đỉnh
đỉnh
đáy
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 2
Danh sách kiungănxếp - Stack
Hai thao tác cơ bn đốivi danh sách kiungăn
xếp
z push(Element e) : b sung phnt vào Stack
z Element pop(): Loib tr ra giá tr caphntửở
đỉnh Stack
Các thao tác khác
z Int size(): Tr ra s các phnt trong Stack
z Boolean isEmpty(): KimtraxemStack córng không
z Element top(): Tr ra giá tr caphntửởđnh Stack
Các thao tác cơ bnca Stack
Top
Stack
Top
Push
Data
Stack
Top
Đẩymtphnt
vào stack
Stack
Overflow
Data
Trường hpStack đầy
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 3
Các thao tác cơ bnca Stack
Pop
Top
Stack
Top
Stack
Data
Lyraphntửởđnh
stack
Top
Stack
Underflow
Trường hp Stack cn
Danh sách kiungănxếp
[9,8,7]3size()
[9,8,7]-push(7)
[9,8]-push(8)
[9]-push(9)
[]trueisEmpty()
[]5pop()
[5]7pop()
[5,7]7top()
[5,7]-push(7)
[5]3pop()
[5,3]-push(3)
[5]-push(5)
[ ]-create()
StackOutputThao tác
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 4
ng dng caStack
Lưutr các trang web đãtng được duyttrên
Web browser
Cài đặt thao tác Undo trong các phnmmson
tho
Lưudanhsáchcácligi hàm trong Java Virtual
Machine
Lưutr kế tiếpca Stack
z Stack có thểđưclưutr bimtvector lưutr S, gmn
ô nh kế tiếp nhau
z Đỉnh stack đượcxácđịnh bimtch s T
T s đượccpnhtnếucóthaotácb sung hay loib
đượcthchintrênstack
S
123
t
N
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 5
Lưutr kế tiếpca Stack
z Giithutb sung mtphnt vào Stack đượclưutr kế
tiếp
Procedure PUSH(S,T,X)
Begin
{S: vector lưutr n ô nh; T: ch s caphntửđnh stack
hinthi; X là giá tr cn thêm vào }
1. if T >= n then begin
write(‘STACK TRÀN’);
return;
end;
2. T:= T+1;
S[T] := X;
End
Lưutr kế tiếpca Stack
z Giithutlyraphntửởđnh caStack đượclưutr
kế tiếp
Procedure POP(S,T, Y)
Begin
{S: stack đang xét ; T: ch s caphnt ti đỉnh stack hinthi;
Phntửđưclyrasẽđưcbolưus dng biếnY }
1. if T = 0 then begin
write(‘STACK CN’); return;
end;
2. Y:= S[T];
S[T] := null;
T:= T-1;
End
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 6
Hiunăng Hnchế
z Hiunăng
n là s phnt castack
Không gian lưutr : O(n)
Cácthaotáccơ bncóđộ phctpO(1)
z Hnchế
Kích thướcti đaphi đượcxácđịnh trướcvà
không được thay đổi
Xyratrànstack
Lưutr móc ni đốivi Stack
Cách tiếpcn1
z Đỉnh ca Stack được coi phnt nm ởđu danh sách
z pop() : Lyraphntửđu tiên trong danh sách móc ni
z push(o) : B sung mtphnt vào đầudanhsáchmócni
Đỉnh Stack
L
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 7
Lưutr móc ni đốivi Stack
Đỉnh Stack
L
•Cáchtiếpcn2
•Phnt cui cùng đượccoilàđỉnh stack
•pop() : Lyraphnt cui cùng trong danh sách móc ni
•push(o): B sung mtphnt vào cui danh sách móc ni
zCách lưutr móc ni nào phù hphơn đốivicutrúcd liu Stack?
Lưutr móc ni đốivi Stack
Khai báo Stack móc ni trong C
struct stacknode {
int item;
struct stacknode *next;
} ;
typedef struct stacknode STACKNODE;
typedef STACKNODE * STACKNODEPTR;
STACKNODEPTR top = NULL;
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 8
Lưutr móc ni đốivi Stack
B sung vào Stack
int push ( STACKNODEPTR *top , int value ) {
STACKNODEPTR newnode;
newnode = malloc sizeof (STACKNODE);
if (nut == null) { printf(“\n No memory”); return 1; }
else {
newnode->item = value;
newnode ->next = *top;
*top = newnode;
return 0;
}
}
Lưutr móc ni đốivi Stack
Loib nút
int pop ( STACKNODEPTR *top) {
int item; STACKNODEPTR temp;
temp = *top;
item = (*top)->item;
*top = (*top)->next;
free (temp);
return item;
}
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 9
Danh sách kiuhàngđợi-Queue
z Queue
z Queue (Hàng đợi) là mtkiu
danh sách tuyến tính đặcbit
z Phép b sung và loib hot
động theo cơ chế “vào trước
ra trước” (first in first out) ; b
sung mt đầuthìloibỏở
đầukia
lisau
li
trước
Danh sách kiuhàngđợi-Queue
Hai hàm cơ bn đốivi danh sách kiuhàngđợi
z enqueue(Element e)
z Element dequeue()
Các hàm khác
z create():
z size() :
z isEmpty():
z Element front()
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 10
Danh sách kiuhàngđợi–Queue
[9,8,7]3size()
[9,8,7]-enqueue(7)
[9,8]-enqueue(8)
[9]-enqueue(9)
[]trueisEmpty()
[]7dequeue()
[7]3dequeue()
[3,7]3front()
[3,7]-enqueue(7)
[3]5dequeue()
[5,3]-enqueue(3)
[5]-enqueue(5)
[ ]-create()
QueueOutputThao tác
ng dng caQueue
Hàng đợi trong các phòng bán
Truy nhp vào các thiếtb dùng chung tivăn
phòng (ví d máy in)
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 11
Lưutr kế tiếp đốiviQueue
S dng mtvector lưutr Q gmn ô nh kế tiếpnhauđể
biudinmt Queue
Cnnm được hai ch s
R: Ch s caphnt nm lisaucaQ
F: Ch s caphntửởlitrướccaQ
Q
1
23 rf
Lưutr kế tiếp đốiviQueue
z Khi Queue rng thì F = R = 0
z Khi b sung thêm mtphnt vào Queue thì R tăng lên 1
z Khi lyramtphnt trong Queue thì F tăng lên 1
z Nhược đimcacácht chclưutr y
Các phnt trong Queue s dch chuynkhpkhônggiannh
nếuliêntcthchinb sung riloib
Hintượng TRÀN vnxy ra khi vector lưutr Q vncònch
nhưng R = n
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 12
Lưutr kế tiếp đốiviQueue
z Khcphccácvn đề bng cách coi vector lưutr
Queue đượct chcdướidng vòng
Q[1] được coi nhưđng sau Q[n]
F
R
Q[1]
Q[2]
Q[3]
Q[n]
Q
123 fr
Các thao tác cơ bnca Queue
Queue
Enqueue
D
Data
A B
front
rear
A B D
front
rear
Queue
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 13
Các thao tác cơ bnca Queue
Queue
Dequeue
A
Data
B D
front
rear
A B D
front
rear
Queue
Lưutr kế tiếp đốiviQueue
z Giithutb sung vào Queue đượclưutr trong vector Q
gmn phnt đưct chcdướidng thường
Procedure ENQUEUE(Q,F,R,X)
Begin
1. if (R >= n) then begin
write(‘QUEUE TRÀN’);
return;
end;
2. {Q rng} if F = 0 then F:= R:= 1;
3. else R:= R+ 1;
4. Q[R] := X;
End
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 14
Lưutr kế tiếp đốiviQueue
z Giithutlyra(loib ) khi Queue
Procedure DEQUEUE(Q,F,R, Y)
Begin
{ Y là biếnlưutr phntửđưclyra}
1. if F = 0 then begin
write(‘QUEUE CN’);
return;
end;
2. Y:= Q[F]; {lưu giá tr caphnt cnly}
3. if F = R=1 then F:= R:= 0; { Queue ch còn mtphnt}
4. else F:= F+ 1;
End
Lưutr kế tiếp đốiviQueue
z Bài tp: Hãy viếtgiithutthchinb sung và loib
trên Queue lưutr kế tiếpdướidng vòng
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 15
Lưutr móc ni đốivi Queue
Cách tiếpcn1: S dng danh sách ni đơn
z Litrướcca Queue là đầu danh sách
z enqueue(o): b sung phnt vào cui danh sách
z dequeue() : loib phntửởđu danh sách
z Luôn nmgi hai con tr F tr tiphntửởlitrước
ca queue, R tr tiphntửởlisauca queue
Lối sau của
Queue
L
R
F
Litrước
ca Queue
Lưutr móc ni đốivi Queue
Cách tiếpcn2:
z Lisauca Queue là đầu danh ch
z enqueue(o): b sung phnt vào đầu danh sách
z dequeue() : loib phntửởcui danh sách
Lối trước của
Queue
L
F
R
Lisau
ca Queue
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 16
Lưutr móc ni đốivi Queue
z Giithutb sung mtphnt o Queue lưutr trong
danh sách móc ni–B sung vào cui danh sách
Procedure ENQUEUE(F,R,X)
Begin
1. {Khito nút mi} Call New(p);
INFO(p) := X; LINK(p) := Null;
2. {Danh sách đã cho rng} if F = Null then F:= R:= p;
3. else LINK(R) := p; R:= p;
End
Lưutr móc ni đốivi Queue
z Giithutloib phnt khi Queue – Loib phnt
đầu tiên trong danh sách
Procedure DEQUEUE(F,R, Y)
Begin
{ Y là biếnlưutr phntửđưclyra}
1. p:= F; Y:= INFO(p);
2. {Danh sách ban đầuch mtphnt}
if (F = R) and (F <> Null) then F:= R:= Null;
2. else F:= LINK(p);
3. Call Dispose(p) ;
End
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 17
Hàng đợihaiđầu-DEQueue
z DeQueue
Hàng đợi hai đầulàmtcutrúcd liudng hàng đợi
nhưng h tr phép b sung và loibỏởcảđuvàcui
z Các hàm cơ s cahàngđợi hai đầuD
insertFirst(o)
insertLast(o) :
removeFirst()
removeLast()
z Các hàm khác
first()
last()
size()
isEmpty()
create()
Hàng đợihaiđầu-DeQueue
[8,9,7]3size()
[8,9,7]-insertLast(7)
[8,9]-insertFirst(8)
[9]-insertLast(9)
[]trueisEmpty()
[]errorremoveLast()
[]7removeLast()
[7]3removeFirst()
[5,7]-insertLast(7)
[5]3removeFirst()
[3,5]-insertFirst(3)
[5]-insertFirst(5)
[ ]-create()
DeQueueOutputThao tác
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 18
Lưutr móc nivi DeQueue
z DeQueue đượclưutr s dng cu trúc danh sách
móc ni kép (Doubly Linked – List)
Mi nút trong danh sách ngoài trường INFO chad
liucòncó2 trường con tr
z PREV
z NEXT
Cnnm được hai con tr, con tr L tr tinútcc
trái, con tr R tr ti nút ccphica danh sách
Vi danh sách rng , L = R = NULL
L
BCGH
R
Lưutr móc ni đốivi DeQueue
z Giithutb sung phnt vào đầumt DeQueue lưu
tr trong mt danh ch nikép
z Giithutloib phntửđumt DeQueue lưutr
trong mtdanhsáchnikép
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 19
Bài toán đổis cơ s
Bài toán: Viếtmts trong h thp phân thành s
trong h cơ s b btk
z d:
(356)
10
= (101100100)
2
(356)
10
= (544)
8
(356)
10
= (164)
16
Bài toán đổicơ s s dng Stack
z d:
(356)
10
= (101100100)
2
356
178
89
44
22
11
5
2
1
2
2
2
2
2
2
2
2
2
0
1
0
1
1
0
0
1
0
0
Cu trúc d liu và Gii thut
Đỗ Bích Dip - Khoa CNTT - ĐHBK Hà
ni 20
Bài toán đổicơ s s dng Stack
Thut toán:
z Đầu vào: S n trong h thpphân
z Đầura: S tương ng vi n trong hệđếmcơ s b
z Thchin
1. Lych s tobin%b. ĐẩyvàoStack
2. Thay n bng n/b để tiếptclycácch s tiếp theo trong
kếtqu
3. Lplibước 1 và 2 cho đếnkhikếtqu ca phép chia là
0
4. Lnlượtlycácch s ra khi Stack và in chúng ra kết
qu
Bài toán đổicơ s s dng Stack
4
6
4
4
6
1
n= 356
Empty stack
n%16 = 4
n = n/16 = 22
n%16 = 6
n = n/16 = 1
n%16 = 1
n = n/16 = 0
| 1/29

Preview text:

Cấu trúc dữ liệu và Giải thuật
Cấu trúc dữ liệu và Giải thuật Chương III: Stack và Queue
Danh sách kiểu ngăn xếp - Stack – Stack
z Một kiểu danh sách tuyến tính đặc biệt đỉnh
z Phép bổ sung và phép loại bỏ tuân
thủ theo cơ chế “vào sau ra trước”
(last in first out) , được thực hiện ở đầu đỉnh đáy
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 1
Cấu trúc dữ liệu và Giải thuật
Danh sách kiểu ngăn xếp - Stack
– Hai thao tác cơ bản đối với danh sách kiểu ngăn xếp
z push(Element e) : bổ sung phần tử vào Stack
z Element pop(): Loại bỏ và trả ra giá trị của phần tử ở đỉnh Stack – Các thao tác khác
z Int size(): Trả ra số các phần tử trong Stack
z Boolean isEmpty(): Kiểm tra xem Stack có rỗng không
z Element top(): Trả ra giá trị của phần tử ở đỉnh Stack
Các thao tác cơ bản của Stack Push Đẩy một phần tử Data vào stack Top Top Stack Stack Overflow Data Top Trường hợp Stack đầy Stack
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 2
Cấu trúc dữ liệu và Giải thuật
Các thao tác cơ bản của Stack Pop
Lấy ra phần tử ở đỉnh Data stack Top Top Stack Stack Underflow Trường hợp Stack cạn Top Stack
Danh sách kiểu ngăn xếp Thao tác Output Stack create() - [ ] push(5) - [5] push(3) - [5,3] pop() 3 [5] push(7) - [5,7] top() 7 [5,7] pop() 7 [5] pop() 5 [] isEmpty() true [] push(9) - [9] push(8) - [9,8] push(7) - [9,8,7] size() 3 [9,8,7]
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 3
Cấu trúc dữ liệu và Giải thuật
Ứng dụng của Stack
– Lưu trữ các trang web đã từng được duyệt trên Web browser
– Cài đặt thao tác Undo trong các phần mềm soạn thảo
– Lưu danh sách các lời gọi hàm trong Java Virtual Machine
Lưu trữ kế tiếp của Stack
z Stack có thể được lưu trữ bởi một vector lưu trữ S, gồm n ô nhớ kế tiếp nhau
z Đỉnh stack được xác định bởi một chỉ số T
– T sẽ được cập nhật nếu có thao tác bổ sung hay loại bỏ
được thực hiện trên stack S 1 2 3 t N
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 4
Cấu trúc dữ liệu và Giải thuật
Lưu trữ kế tiếp của Stack
z Giải thuật bổ sung một phần tử vào Stack được lưu trữ kế tiếp Procedure PUSH(S,T,X) Begin
{S: vector lưu trữ có n ô nhớ; T: chỉ số của phần tử đỉnh stack
hiện thời; X là giá trị cần thêm vào } 1. if T >= n then begin write(‘STACK TRÀN’); return; end; 2. T:= T+1; S[T] := X; End
Lưu trữ kế tiếp của Stack
z Giải thuật lấy ra phần tử ở đỉnh của Stack được lưu trữ kế tiếp Procedure POP(S,T, Y) Begin
{S: stack đang xét ; T: chỉ số của phẩn tử tại đỉnh stack hiện thời;
Phần tử được lấy ra sẽ được bảo lưu sử dụng biến Y } 1. if T = 0 then begin
write(‘STACK CẠN’); return; end; 2. Y:= S[T]; S[T] := null; T:= T-1; End
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 5
Cấu trúc dữ liệu và Giải thuật
Hiệu năng và Hạn chế z Hiệu năng
– n là số phần tử của stack
– Không gian lưu trữ : O(n)
– Các thao tác cơ bản có độ phức tạp O(1) z Hạn chế
– Kích thước tối đa phải được xác định trước và không được thay đổi – Xảy ra tràn stack
Lưu trữ móc nối đối với Stack – Cách tiếp cận 1
z Đỉnh của Stack được coi là phần tử nằm ở đầu danh sách
z pop() : Lấy ra phần tử đầu tiên trong danh sách móc nối
z push(o) : Bổ sung một phần tử vào đầu danh sách móc nối L Đỉnh Stack
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 6
Cấu trúc dữ liệu và Giải thuật
Lưu trữ móc nối đối với Stack • Cách tiếp cận 2
•Phần tử cuối cùng được coi là đỉnh stack
•pop() : Lấy ra phần tử cuối cùng trong danh sách móc nối
•push(o): Bổ sung một phần tử vào cuối danh sách móc nối L Đỉnh Stack
zCách lưu trữ móc nối nào phù hợp hơn đối với cấu trúc dữ liệu Stack?
Lưu trữ móc nối đối với Stack
– Khai báo Stack móc nối trong C struct stacknode { int item; struct stacknode *next; } ;
typedef struct stacknode STACKNODE;
typedef STACKNODE * STACKNODEPTR; STACKNODEPTR top = NULL;

Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 7
Cấu trúc dữ liệu và Giải thuật
Lưu trữ móc nối đối với Stack – Bổ sung vào Stack
int push ( STACKNODEPTR *top , int value ) { STACKNODEPTR newnode;
newnode = malloc sizeof (STACKNODE);
if (nut == null) { printf(“\n No memory”); return 1; } else { newnode->item = value; newnode ->next = *top; *top = newnode; return 0; } }
Lưu trữ móc nối đối với Stack – Loại bỏ nút
int pop ( STACKNODEPTR *top) { int item; STACKNODEPTR temp; temp = *top; item = (*top)->item; *top = (*top)->next; free (temp); return item; }
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 8
Cấu trúc dữ liệu và Giải thuật
Danh sách kiểu hàng đợi - Queue lối z Queue trước
z Queue (Hàng đợi) là một kiểu
danh sách tuyến tính đặc biệt
z Phép bổ sung và loại bỏ hoạt
động theo cơ chế “vào trước
ra trước” (first in first out) ; bổ
sung ở một đầu thì loại bỏ ở đầu kia lối sau
Danh sách kiểu hàng đợi - Queue
– Hai hàm cơ bản đối với danh sách kiểu hàng đợi z enqueue(Element e) z Element dequeue() – Các hàm khác z create(): z size() : z isEmpty(): z Element front()
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 9
Cấu trúc dữ liệu và Giải thuật
Danh sách kiểu hàng đợi – Queue Thao tác Output Queue create() - [ ] enqueue(5) - [5] enqueue(3) - [5,3] dequeue() 5 [3] enqueue(7) - [3,7] front() 3 [3,7] dequeue() 3 [7] dequeue() 7 [] isEmpty() true [] enqueue(9) - [9] enqueue(8) - [9,8] enqueue(7) - [9,8,7] size() 3 [9,8,7]
Ứng dụng của Queue
– Hàng đợi trong các phòng bán vé
– Truy nhập vào các thiết bị dùng chung tại văn phòng (ví dụ máy in)
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 10
Cấu trúc dữ liệu và Giải thuật
Lưu trữ kế tiếp đối với Queue
– Sử dụng một vector lưu trữ Q gồm n ô nhớ kế tiếp nhau để biểu diễn một Queue
– Cần nắm được hai chỉ số
R: Chỉ số của phần tử nằm ở lối sau của Q
F: Chỉ số của phần tử ở lối trước của Q Q 1 2 3 f r
Lưu trữ kế tiếp đối với Queue
z Khi Queue rỗng thì F = R = 0
z Khi bổ sung thêm một phần tử vào Queue thì R tăng lên 1
z Khi lấy ra một phần tử trong Queue thì F tăng lên 1
z Nhược điểm của cách tổ chức lưu trữ này
– Các phần tử trong Queue sẽ dịch chuyển khắp không gian nhớ
nếu liên tục thực hiện bổ sung rồi loại bỏ
– Hiện tượng TRÀN vẫn xảy ra khi vector lưu trữ Q vẫn còn chỗ nhưng R = n
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 11
Cấu trúc dữ liệu và Giải thuật
Lưu trữ kế tiếp đối với Queue
z Khắc phục các vấn đề bằng cách coi vector lưu trữ
Queue được tổ chức dưới dạng vòng F
– Q[1] được coi như đứng sau Q[n] Q[n] Q[1] Q[2] Q[3] R Q 1 2 3 r f
Các thao tác cơ bản của Queue Data D Enqueue A B A B D front rear front rear Queue Queue
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 12
Cấu trúc dữ liệu và Giải thuật
Các thao tác cơ bản của Queue Data A Dequeue A B D B D front rear front rear Queue Queue
Lưu trữ kế tiếp đối với Queue
z Giải thuật bổ sung vào Queue được lưu trữ trong vector Q
gồm n phần tử và được tổ chức dưới dạng thường
Procedure ENQUEUE(Q,F,R,X) Begin 1. if (R >= n) then begin write(‘QUEUE TRÀN’); return; end;
2. {Q rỗng} if F = 0 then F:= R:= 1; 3. else R:= R+ 1; 4. Q[R] := X; End
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 13
Cấu trúc dữ liệu và Giải thuật
Lưu trữ kế tiếp đối với Queue
z Giải thuật lấy ra (loại bỏ ) khỏi Queue
Procedure DEQUEUE(Q,F,R, Y) Begin
{ Y là biến lưu trữ phần tử được lấy ra } 1. if F = 0 then begin write(‘QUEUE CẠN’); return; end;
2. Y:= Q[F]; {lưu giá trị của phần tử cần lấy}
3. if F = R=1 then F:= R:= 0; { Queue chỉ còn một phần tử} 4. else F:= F+ 1; End
Lưu trữ kế tiếp đối với Queue
z Bài tập: Hãy viết giải thuật thực hiện bổ sung và loại bỏ
trên Queue lưu trữ kế tiếp dưới dạng vòng
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 14
Cấu trúc dữ liệu và Giải thuật
Lưu trữ móc nối đối với Queue
– Cách tiếp cận 1: Sử dụng danh sách nối đơn
z Lối trước của Queue là đầu danh sách
z enqueue(o): bổ sung phần tử vào cuối danh sách
z dequeue() : loại bỏ phần tử ở đầu danh sách R F L Lối trước Lối sau của của Queue Queue
z Luôn nắm giữ hai con trỏ F trỏ tới phần tử ở lối trước
của queue, R trỏ tới phần tử ở lối sau của queue
Lưu trữ móc nối đối với Queue – Cách tiếp cận 2:
z Lối sau của Queue là đầu danh sách
z enqueue(o): bổ sung phần tử vào đầu danh sách
z dequeue() : loại bỏ phần tử ở cuối danh sách F R L Lối sau Lối trước của của Queue Queue
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 15
Cấu trúc dữ liệu và Giải thuật
Lưu trữ móc nối đối với Queue
z Giải thuật bổ sung một phần tử vào Queue lưu trữ trong
danh sách móc nối – Bổ sung vào cuối danh sách
Procedure ENQUEUE(F,R,X) Begin
1. {Khởi tạo nút mới} Call New(p);
INFO(p) := X; LINK(p) := Null;
2. {Danh sách đã cho rỗng} if F = Null then F:= R:= p; 3. else LINK(R) := p; R:= p; End
Lưu trữ móc nối đối với Queue
z Giải thuật loại bỏ phần tử khỏi Queue – Loại bỏ phần tử đầu tiên trong danh sách
Procedure DEQUEUE(F,R, Y) Begin
{ Y là biến lưu trữ phần tử được lấy ra } 1. p:= F; Y:= INFO(p);
2. {Danh sách ban đầu chỉ có một phần tử}
if (F = R) and (F <> Null) then F:= R:= Null; 2. else F:= LINK(p); 3. Call Dispose(p) ; End
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 16
Cấu trúc dữ liệu và Giải thuật
Hàng đợi hai đầu - DEQueue z DeQueue
– Hàng đợi hai đầu là một cấu trúc dữ liệu dạng hàng đợi
nhưng nó hỗ trợ phép bổ sung và loại bỏ ở cả đầu và cuối
z Các hàm cơ sở của hàng đợi hai đầu D – insertFirst(o) – insertLast(o) : – removeFirst() – removeLast() z Các hàm khác – first() – last() – size() – isEmpty() – create()
Hàng đợi hai đầu - DeQueue Thao tác Output DeQueue create() - [ ] insertFirst(5) - [5] insertFirst(3) - [3,5] removeFirst() 3 [5] insertLast(7) - [5,7] removeFirst() 3 [7] removeLast() 7 [] removeLast() error [] isEmpty() true [] insertLast(9) - [9] insertFirst(8) - [8,9] insertLast(7) - [8,9,7] size() 3 [8,9,7]
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 17
Cấu trúc dữ liệu và Giải thuật
Lưu trữ móc nối với DeQueue
z DeQueue được lưu trữ sử dụng cấu trúc danh sách
móc nối kép (Doubly Linked – List)
– Mỗi nút trong danh sách ngoài trường INFO chứa dữ
liệu còn có 2 trường con trỏ z PREV z NEXT
– Cần nắm được hai con trỏ, con trỏ L trỏ tới nút cực
trái, con trỏ R trỏ tới nút cực phải của danh sách
– Với danh sách rỗng , L = R = NULL L B C G H R
Lưu trữ móc nối đối với DeQueue
z Giải thuật bổ sung phần tử vào đầu một DeQueue lưu
trữ trong một danh sách nối kép
z Giải thuật loại bỏ phần tử đầu một DeQueue lưu trữ
trong một danh sách nối kép
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 18
Cấu trúc dữ liệu và Giải thuật
Bài toán đổi số cơ số
– Bài toán: Viết một số trong hệ thập phân thành số
trong hệ cơ số b bất kỳ z Ví dụ: – (356) = (101100100) 10 2 – (356) = (544) 10 8 – (356) = (164) 10 16
Bài toán đổi cơ số sử dụng Stack z Ví dụ: – (356)10 = (101100100)2 356 2 0 178 2 0 89 2 1 44 2 0 22 2 0 11 2 1 5 2 1 2 2 0 1 2 1 0
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 19
Cấu trúc dữ liệu và Giải thuật
Bài toán đổi cơ số sử dụng Stack – Thuật toán:
z Đầu vào: Số n trong hệ thập phân
z Đầu ra: Số tương ứng với n trong hệ đếm cơ số b z Thực hiện
1. Lấy chữ số tạo bởi n%b. Đẩy vào Stack
2. Thay n bằng n/b để tiếp tục lấy các chữ số tiếp theo trong kết quả
3. Lặp lại bước 1 và 2 cho đến khi kết quả của phép chia là 0
4. Lần lượt lấy các chữ số ra khỏi Stack và in chúng ra kết quả
Bài toán đổi cơ số sử dụng Stack 1 6 6 4 4 4 n= 356 n%16 = 4 n%16 = 6 n%16 = 1 Empty stack n = n/16 = 22 n = n/16 = 1 n = n/16 = 0
Đỗ Bích Diệp - Khoa CNTT - ĐHBK Hà nội 20