06/01/2026
1
1. Các kiểu dữ liệu trừu tượng bản
Khái niệm: Kiểu dữ liệu trừu tượng (ADT)
một hình dữ liệu trừu ợng kèm theo một tập
các phép toán được định nghĩa trên mô hình đó.
Các ADT bản:
Mảng (Array)
Danh sách (List)
Danh sách liên kết (Linked List)
Ngăn xếp (Stack)
Hàng đợi (Queue)
CHƯƠNG 2
CÁC KIỂU DỮ LIỆU TRỪU TƯỢNG CƠ BẢN
2. ADT mảng (Array)
Mảng một tập hợp hữu hạn các phần tử cùng
kiểu, được sắp xếp theo một thứ tự tuyến tính
độ dài nhất định.
06/01/2026
2
Các phép toán bản: Rất ít. Gần nhưng phải
viết tay các hàm hoặc sử dụng các thư viện hỗ trợ.
Mảng phù hợp cho dữ liệu thứ tự, đơn giản,
nhanh chóng, xác định số lượng phần tử.
3. ADT Danh sách (List)
Danh sách một tập hợp hữu hạn các phần tử
cùng kiểu, được sắp xếp theo một thứ tự tuyến
tính (còn thể goi Dynamic Array). thể
không giới hạn số phần t trong List.
06/01/2026
3
Các phép toán bản:
Create(): tạo danh sách rỗng
IsEmpty(): kiểm tra rỗng
Insert(x, p): chèn phần tử x tại vị trí p
Delete(p): xóa phần t tại vị trí p
Search(x): tìm phần tử x
Traverse(): duyệt danh sách
Danh sách phù hợp cho dữ liệu thứ tự.
Mã giả các hàm của ADT LIST:
Create(L)
L.size 0
IsEmpty(L)
if L.size = 0 then
return TRUE
else
return FALSE
06/01/2026
4
Insert(L, x, p)
if L.size = MAX then
return "Danh sách đầy"
if p < 0 or p > L.size then
return "Vị trí không hợp lệ"
for i L.size downto p+1 do
L.A[i] L.A[i-1]
L.A[p] x
L.size L.size + 1
Delete(L, p)
if IsEmpty(L) then
return "Danh sách rỗng"
if p < 0 or p L.size then
return "Vị trí không hợp lệ"
for i p to L.size-2 do
L.A[i] L.A[i+1]
L.size L.size - 1
06/01/2026
5
Search(L, x)
for i 0 to L.size-1 do
if L.A[i] = x then
return i // v trí tìm thấy
return -1
Traverse(L)
if IsEmpty(L) then
print "Danh sách rỗng"
else
for i 0 to L.size-1 do
print L.A[i]
06/01/2026
6
Create(L)
Insert(L, 2, 0)
Insert(L, 4, 1)
Insert(L, 6, 2)
Traverse(L)
Insert(L, 5, 2)
Traverse(L)
Delete(L, 1)
Traverse(L)
pos Search(L, 5)
print pos
4. ADT Danh sách liên kết (Linked List)
Danh sách liên kết một danh ch gồm c nút
(node), mỗi nút chứa: dữ liệu liên kết đến nút
khác.
Danh sách liên kết đơn cấu trúc: Data Next.
Danh sách liên kết kép cấu trúc: Data, Next
Prev.
06/01/2026
7
Các phép toán bản:
IsEmpty(): kiểm tra rỗng
Insert(x, p): chèn phần tử x tại vị trí p
Delete(p): xóa phần t tại vị trí p
Search(x): tìm phần tử x
Traverse(): duyệt danh sách
Mã giả các hàm của ADT LINKED LIST đơn:
Create(L)
L.Head NULL
IsEmpty(L)
if L.Head = NULL then
return TRUE
else
return FALSE
06/01/2026
8
Insert(L, x, 0)
new new Node
new.data x
new.next L.Head
L.Head new
Insert(L, x, p)
if p < 0 then
return "Vị trí không hợp lệ"
cur L.Head
i 0
while cur NULL and i < p-1 do
cur cur.next
i i + 1
if cur = NULL then
return "Vị trí không hợp lệ"
new new Node
new.data x
new.next cur.next
cur.next new
06/01/2026
9
Delete(L, 0)
if IsEmpty(L) then
return "Danh sách rỗng"
temp L.Head
L.Head L.Head.next
delete temp
Delete(L, p)
if IsEmpty(L) then
return "Danh sách rỗng"
cur L.Head
i 0
while cur.next NULL and i < p-1 do
cur cur.next
i i + 1
if cur.next = NULL then
return "Vị trí không hợp lệ"
temp cur.next
cur.next temp.next
delete temp
06/01/2026
10
Search(L, x)
cur L.Head
pos 0
while cur NULL do
if cur.data = x then
return pos
cur cur.next
pos pos + 1
return -1 // không tìm thấy
Traverse(L)
if IsEmpty(L) then
print "Danh sách rỗng"
else
cur L.Head
while cur NULL do
print cur.data
cur cur.next
06/01/2026
11
L.Head NULL
Insert(L, 2, 0)
Insert(L, 4, 1)
Insert(L, 6, 2)
Traverse(L)
Insert(L, 5, 2)
Traverse(L)
Delete(L, 1)
Traverse(L)
pos Search(L, 5)
print pos
5. ADT Ngăn xếp (Stack)
Ngăn xếp một ADT trong đó các thao tác chỉ
thực hiện tại một đầu (top).
Nguyên tắc: LIFO Last In, First Out.
06/01/2026
12
Các phép toán bản:
Push(x): đưa phần tử x vào stack
Pop(): lấy phần tử trên cùng ra
Peek(): xem phần tử trên cùng
IsEmpty()
IsFull()
Phù hợp cho d liệu thứ tự ngược.
Mã giả các hàm của ADT STACK:
Create(S)
S.top -1
IsEmpty(S)
if S.top = -1 then
return TRUE
else
return FALSE
06/01/2026
13
IsFull(S)
if S.top = MAX - 1 then
return TRUE
else
return FALSE
Push(S, x)
if IsFull(S) then
return "Stack đầy"
S.top S.top + 1
S.A[S.top] x
Pop(S)
if IsEmpty(S) then
return "Stack rỗng"
x S.A[S.top]
S.top S.top - 1
return x
Peek(S)
if IsEmpty(S) then
return "Stack rỗng"
return S.A[S.top]
06/01/2026
14
Create(S)
Push(S, 5)
Push(S, 8)
Push(S, 3)
Peek(S)
Pop(S)
Peek(S)
IsEmpty(S)
IsFull(S)
6. ADT Hàng đợi (Queue)
Hàng đợi một ADT trong đó phần tử vào trước
sẽ ra trước.
Nguyên tắc: FIFO First In, First Out.
06/01/2026
15
Các phép toán bản:
Enqueue(x): thêm phần tử x vào cuối
Dequeue(): lấy phần tử đầu ra
Front()
IsEmpty()
IsFull()
Phù hợp cho d liệu thứ tự nối tiếp.
Mã giả các hàm của ADT QUEUE:
Create(Q)
Q.front -1
Q.rear -1
IsEmpty(Q)
if Q.front = -1 then
return TRUE
else
return FALSE
06/01/2026
16
IsFull(Q)
if (Q.rear + 1) mod MAX = Q.front then
return TRUE
else
return FALSE
Front(Q)
if IsEmpty(Q) then
return "Queue rỗng"
return Q.A[Q.front]
Enqueue(Q, x)
if IsFull(Q) then
return "Queue đầy"
if IsEmpty(Q) then
Q.front 0
Q.rear 0
else
Q.rear (Q.rear + 1) mod MAX
Q.A[Q.rear] x
06/01/2026
17
Dequeue(Q)
if IsEmpty(Q) then
return "Queue rỗng"
x Q.A[Q.front]
if Q.front = Q.rear then
Q.front -1
Q.rear -1
else
Q.front (Q.front + 1) mod MAX
return x
Create(Q)
Enqueue(Q, 5)
Enqueue(Q, 8)
Enqueue(Q, 3)
Front(Q)
Dequeue(Q)
Front(Q)
IsEmpty(Q)
IsFull(Q)
06/01/2026
18
SO SÁNH CÁC KIỂU DỮ LIỆU
TRỪU TƯỢNG CƠ BẢN
Thực tế:
Một bài toán không chỉ có một ADT duy nhất.
Có nhiều ADT đều dùng được, nhưng:
Mức độ phù hợp khác nhau.
Hiệu quả khác nhau.
Độ phức tạp chương trình khác nhau.
dụ 1: Xây dng thành phần phần mềm Quản
danh ch sinh viên.
ADT phù hợp: List, Linked List.
06/01/2026
19
dụ 2: Xây dng thành phần phần mềm Quản
lịch sử thao tác (Undo).
ADT phù hợp: Stack.
dụ 3: Xây dng thành phần phần mềm Quản
Hàng chờ xử công việc.
ADT phù hợp: Queue.
06/01/2026
20
BÀI TẬP
Bài tập 1: Quản lịch học trong ngày
tả: Một ứng dụng cần lưu danh sách c tiết
học trong một ngày theo thứ t thời gian.
Danh sách:
Được tạo một lần vào đầu ngày.
Chỉ dùng để duyệt và hiển thị.
Không có thao tác thêm hoặc xóa trong ngày.
Câu hỏi: Chọn ADT nào là phù hợp Giải thích
lý do.
Đáp án Bài tập 1: Quản lịch học trong ngày
ADT phù hợp: List.
Giải thích: Danh sách tiết học được tạo một lần
không thay đổi trong ngày. Chương trình chủ
yếu duyệt hiển thị dữ liệu theo th tự. Do đó,
ADT danh sách p hợp đơn giản nhất.

Preview text:

06/01/2026 CHƯƠNG 2
CÁC KIỂU DỮ LIỆU TRỪU TƯỢNG CƠ BẢN
1. Các kiểu dữ liệu trừu tượng cơ bản
Khái niệm: Kiểu dữ liệu trừu tượng (ADT) là
một mô hình dữ liệu trừu tượng kèm theo một tập
các phép toán được định nghĩa trên mô hình đó. Các ADT cơ bản:  Mảng (Array)  Danh sách (List)
 Danh sách liên kết (Linked List)  Ngăn xếp (Stack)  Hàng đợi (Queue) 2. ADT mảng (Array)
Mảng là một tập hợp hữu hạn các phần tử cùng
kiểu, được sắp xếp theo một thứ tự tuyến tính có độ dài nhất định. 1 06/01/2026
Các phép toán cơ bản: Rất ít. Gần nhưng phải
viết tay các hàm hoặc sử dụng các thư viện hỗ trợ.
Mảng phù hợp cho dữ liệu có thứ tự, đơn giản,
nhanh chóng, xác định số lượng phần tử. 3. ADT Danh sách (List)
Danh sách là một tập hợp hữu hạn các phần tử
cùng kiểu, được sắp xếp theo một thứ tự tuyến
tính (còn có thể goi là Dynamic Array). Có thể
không giới hạn số phần tử trong List. 2 06/01/2026 Các phép toán cơ bản:
 Create(): tạo danh sách rỗng
 IsEmpty(): kiểm tra rỗng
 Insert(x, p): chèn phần tử x tại vị trí p
 Delete(p): xóa phần tử tại vị trí p
 Search(x): tìm phần tử x
 Traverse(): duyệt danh sách
Danh sách phù hợp cho dữ liệu có thứ tự.
Mã giả các hàm của ADT LIST: Create(L) L.size ← 0 IsEmpty(L) if L.size = 0 then return TRUE else return FALSE 3 06/01/2026 Insert(L, x, p) if L.size = MAX then return "Danh sách đầy"
if p < 0 or p > L.size then
return "Vị trí không hợp lệ" for i ← L.size downto p+1 do L.A[i] ← L.A[i-1] L.A[p] ← x L.size ← L.size + 1 Delete(L, p) if IsEmpty(L) then return "Danh sách rỗng"
if p < 0 or p ≥ L.size then
return "Vị trí không hợp lệ" for i ← p to L.size-2 do L.A[i] ← L.A[i+1] L.size ← L.size - 1 4 06/01/2026 Search(L, x) for i ← 0 to L.size-1 do if L.A[i] = x then
return i // vị trí tìm thấy return -1 Traverse(L) if IsEmpty(L) then print "Danh sách rỗng" else for i ← 0 to L.size-1 do print L.A[i] 5 06/01/2026 Create(L) Insert(L, 2, 0) Insert(L, 4, 1) Insert(L, 6, 2) Traverse(L) Insert(L, 5, 2) Traverse(L) Delete(L, 1) Traverse(L) pos ← Search(L, 5) print pos
4. ADT Danh sách liên kết (Linked List)
Danh sách liên kết là một danh sách gồm các nút
(node), mỗi nút chứa: dữ liệu và liên kết đến nút khác.
Danh sách liên kết đơn có cấu trúc: Data và Next.
Danh sách liên kết kép có cấu trúc: Data, Next và Prev. 6 06/01/2026 Các phép toán cơ bản:
 IsEmpty(): kiểm tra rỗng
 Insert(x, p): chèn phần tử x tại vị trí p
 Delete(p): xóa phần tử tại vị trí p
 Search(x): tìm phần tử x
 Traverse(): duyệt danh sách
Mã giả các hàm của ADT LINKED LIST đơn: Create(L) L.Head ← NULL IsEmpty(L) if L.Head = NULL then return TRUE else return FALSE 7 06/01/2026 Insert(L, x, 0) new ← new Node new.data ← x new.next ← L.Head L.Head ← new Insert(L, x, p) if p < 0 then
return "Vị trí không hợp lệ" cur ← L.Head i ← 0
while cur ≠ NULL and i < p-1 do cur ← cur.next i ← i + 1 if cur = NULL then
return "Vị trí không hợp lệ" new ← new Node new.data ← x new.next ← cur.next cur.next ← new 8 06/01/2026 Delete(L, 0) if IsEmpty(L) then return "Danh sách rỗng" temp ← L.Head L.Head ← L.Head.next delete temp Delete(L, p) if IsEmpty(L) then return "Danh sách rỗng" cur ← L.Head i ← 0
while cur.next ≠ NULL and i < p-1 do cur ← cur.next i ← i + 1 if cur.next = NULL then
return "Vị trí không hợp lệ" temp ← cur.next cur.next ← temp.next delete temp 9 06/01/2026 Search(L, x) cur ← L.Head pos ← 0 while cur ≠ NULL do if cur.data = x then return pos cur ← cur.next pos ← pos + 1
return -1 // không tìm thấy Traverse(L) if IsEmpty(L) then print "Danh sách rỗng" else cur ← L.Head while cur ≠ NULL do print cur.data cur ← cur.next 10 06/01/2026 L.Head ← NULL Insert(L, 2, 0) Insert(L, 4, 1) Insert(L, 6, 2) Traverse(L) Insert(L, 5, 2) Traverse(L) Delete(L, 1) Traverse(L) pos ← Search(L, 5) print pos 5. ADT Ngăn xếp (Stack)
Ngăn xếp là một ADT trong đó các thao tác chỉ
thực hiện tại một đầu (top).
Nguyên tắc: LIFO – Last In, First Out. 11 06/01/2026 Các phép toán cơ bản:
 Push(x): đưa phần tử x vào stack
 Pop(): lấy phần tử trên cùng ra
 Peek(): xem phần tử trên cùng  IsEmpty()  IsFull()
Phù hợp cho dữ liệu có thứ tự ngược.
Mã giả các hàm của ADT STACK: Create(S) S.top ← -1 IsEmpty(S) if S.top = -1 then return TRUE else return FALSE 12 06/01/2026 IsFull(S) if S.top = MAX - 1 then return TRUE else return FALSE Push(S, x) if IsFull(S) then return "Stack đầy" S.top ← S.top + 1 S.A[S.top] ← x Pop(S) if IsEmpty(S) then return "Stack rỗng" x ← S.A[S.top] S.top ← S.top - 1 return x Peek(S) if IsEmpty(S) then return "Stack rỗng" return S.A[S.top] 13 06/01/2026 Create(S) Push(S, 5) Push(S, 8) Push(S, 3) Peek(S) Pop(S) Peek(S) IsEmpty(S) IsFull(S) 6. ADT Hàng đợi (Queue)
Hàng đợi là một ADT trong đó phần tử vào trước sẽ ra trước.
Nguyên tắc: FIFO – First In, First Out. 14 06/01/2026 Các phép toán cơ bản:
 Enqueue(x): thêm phần tử x vào cuối
 Dequeue(): lấy phần tử ở đầu ra  Front()  IsEmpty()  IsFull()
Phù hợp cho dữ liệu có thứ tự nối tiếp.
Mã giả các hàm của ADT QUEUE: Create(Q) Q.front ← -1 Q.rear ← -1 IsEmpty(Q) if Q.front = -1 then return TRUE else return FALSE 15 06/01/2026 IsFull(Q)
if (Q.rear + 1) mod MAX = Q.front then return TRUE else return FALSE Front(Q) if IsEmpty(Q) then return "Queue rỗng" return Q.A[Q.front] Enqueue(Q, x) if IsFull(Q) then return "Queue đầy" if IsEmpty(Q) then Q.front ← 0 Q.rear ← 0 else
Q.rear ← (Q.rear + 1) mod MAX Q.A[Q.rear] ← x 16 06/01/2026 Dequeue(Q) if IsEmpty(Q) then return "Queue rỗng" x ← Q.A[Q.front] if Q.front = Q.rear then Q.front ← -1 Q.rear ← -1 else
Q.front ← (Q.front + 1) mod MAX return x Create(Q) Enqueue(Q, 5) Enqueue(Q, 8) Enqueue(Q, 3) Front(Q) Dequeue(Q) Front(Q) IsEmpty(Q) IsFull(Q) 17 06/01/2026
SO SÁNH CÁC KIỂU DỮ LIỆU TRỪU TƯỢNG CƠ BẢN Thực tế:
Một bài toán không chỉ có một ADT duy nhất.
Có nhiều ADT đều dùng được, nhưng:
 Mức độ phù hợp khác nhau.  Hiệu quả khác nhau.
 Độ phức tạp chương trình khác nhau.
Ví dụ 1: Xây dựng thành phần phần mềm Quản lý danh sách sinh viên.
ADT phù hợp: List, Linked List. 18 06/01/2026
Ví dụ 2: Xây dựng thành phần phần mềm Quản
lý lịch sử thao tác (Undo). ADT phù hợp: Stack.
Ví dụ 3: Xây dựng thành phần phần mềm Quản
lý Hàng chờ xử lý công việc. ADT phù hợp: Queue. 19 06/01/2026 BÀI TẬP
Bài tập 1: Quản lý lịch học trong ngày
Mô tả: Một ứng dụng cần lưu danh sách các tiết
học trong một ngày theo thứ tự thời gian. Danh sách:
 Được tạo một lần vào đầu ngày.
 Chỉ dùng để duyệt và hiển thị.
 Không có thao tác thêm hoặc xóa trong ngày.
Câu hỏi: Chọn ADT nào là phù hợp và Giải thích lý do.
Đáp án Bài tập 1: Quản lý lịch học trong ngày ADT phù hợp: List.
Giải thích: Danh sách tiết học được tạo một lần
và không thay đổi trong ngày. Chương trình chủ
yếu duyệt và hiển thị dữ liệu theo thứ tự. Do đó,
ADT danh sách là phù hợp và đơn giản nhất. 20