Bài giảng Cấu trúc dữ liệu và giải thuật: Các cấu trúc dữ liệu cơ bản - Đậu Ngọc Hà Dương có nội dung trình bày các kiến thức về danh sách liên kết, ngăn xếp, hàng đợi,... Mời các bạn cùng tham khảo!
Trang 1C u trúc d li u và gi i thu t ấ ữ ệ ả ậ
CÁC CẤU TRÚC DỮ LiỆU
CƠ BẢN
Giảng viên:
Trang 2Nội dung trình bày
2
Trang 3Danh sách liên kết
3
Trang 4Nội dung
Giới thiệu
Các loại danh sách liên kết
Các thao tác trên danh sách liên kết
So sánh danh sách liên kết và mảng
4
Trang 7Giới thiệu
7
Thực tế:
Không xác đ nh đ ị ượ c chính xác s l ố ượ ng ph n t ầ ử
Danh sách bệnh nhân: tăng/giảm.
Danh sách sinh viên: tăng/giảm.
Vùng nh thay đ i trong quá trình s d ng ớ ổ ử ụ
=> Không đủ vùng nhớ cấp phát liên tục.
Trang 8Các loại danh sách liên kết
Trang 9Danh sách liên kết đơn
9
Mỗi phần tử có MỘT liên kết đến phần tử phía sau nó
Trang 10Danh sách liên kết đơn
10
Trang 13Phần tử trên danh sách liên kết
Trang 14number id
name
Trang 15Cài đặt
15
Sinh viên tự viết phần cài đặt cho các ví dụ trên
Trang 16Tổ chức
16
Mỗi danh sách liên kết bao gồm:
Con tr đ n ph n t đ u (ho c/và cu i) danh sách ỏ ế ầ ử ầ ặ ố
(Các) ph n t trên danh sách ầ ử
Dữ liệu
Các mối liên kết
Trang 18Các thao tác trên danh sách liên kết
Trang 21 Tạo node mới có dữ liệu là Data
Cập nhật lại liên kết của pNode và node vừa tạo.
X
pNode
1
Trang 26pHead
Trang 28Danh sách liên kết là gì?
28
Một dãy tuần tự các phần tử (node)
Giữa hai phần tử có liên kết với nhau
Các phần tử không cần phải lưu trữ liên tiếp
Trang 29So sánh danh sách liên kết và mảng
Cần xác định trước số phần tử
Cần cấp phát vùng nhớ liên tục
đủ lớn để lưu trữ mảng lãng phí nếu không dùng hết.
Truy xuất ngẫu nhiên, đơn giản, nhanh chóng
Truy xuất tuần tự, danh sách
liên kết đơn chỉ có thể duyệt 1
chiều
Cần nhiều bộ nhớ hơn để lưu
trữ các liên kết
Trang 31Bài tập 1
31
Cho một DSLK đơn, mỗi node trong DSLK lưu thông tin là 1 số nguyên và con trỏ đến node kế Tạo 2 DSLK đơn mới (không phá huỷ DSLK đã cho)
M t danh sách ch a các s l c a danh sách đã ộ ứ ố ẻ ủcho
M t danh sách ch a các s ch n c a danh sách đã ộ ứ ố ẵ ủcho
Trang 32Bài tập 1
32
In ra các đ ườ ng ch y ạ t nhiên t DSLK đã cho:ự ừ
VÍ DỤ: DSLK ban đ u bi u di n các s : 1 5 6 4 8 3 7 ầ ể ễ ố
In ra các dãy số: 1 5 6
4 8
3 7
Trang 33Bài tập 2
33
Cho danh sách liên kết đơn L, lập giải thuật
thực hiện các phép sau đây:
Trang 34Bài tập 3
34
Hàm MoveToFront có tác dụng di chuyển 1 node trong xâu lên đầu xâu, như hình sau:
Chọn kiểu khai báo hàm phù hợp và viết code
void MoveToFront (NODE pHead , NODE pTail , NODE pNode )
Lưu ý: các kí hiệu có thể là *, & hoặc khoảng
21
Trang 35Ngăn xếp - stack
35
Trang 38Giới thiệu
38
Định nghĩa:
Ngăn x p là v t ch a các đ i ế ậ ứ ố
t ượ ng làm vi c theo c ch “ ệ ơ ế vào sau ra tr ướ ” ( c Last In First Out)
Đ i t ố ượ ng có th đ ể ượ c thêm vào
b t kì lúc nào, nh ng ch có ấ ư ỉ đ i ố
t ượ ng vào sau cùng m i đ ớ ượ c phép l y ra kh i ngăn x p ấ ỏ ế
6 5 4 3 2
Đỉnh
Đáy
Trang 39Các thao tác trên ngăn xếp
Trang 40Lưu trữ ngăn xếp
40
Lưu trữ bằng mảng
Khai báo m ng 1 chi u v i kích th ả ề ớ ướ ố c t i đa N.
t là đ a ch c a ph n t đ nh c a ngăn x p t s thay ị ỉ ủ ầ ử ỉ ủ ế → ẽ
đ i khi ngăn x p ho t đ ng ổ ế ạ ộ
Ngăn xếp rỗng thì giá trị của t là 0
T o ngăn x p S và qu n lý ngăn x p b ng bi n t: ạ ế ả ế ằ ế
Data S[N];
Trang 42Kiểm tra ngăn xếp rỗng
Trang 43Kiểm tra ngăn xếp đầy
Trang 44Thêm phần tử vào ngăn xếp (push)
Trang 45Thêm phần tử vào ngăn xếp (push)
45
Ví dụ:
4 3 2
5 4 3 2
Đỉnh = 3
Ngăn xếp ban đầu Ngăn xếp sau khi thêm push(5)
Đỉnh = 4
Trang 46Lấy phần tử ra khỏi ngăn xếp (pop)
Trang 47Lấy phần tử ra khỏi ngăn xếp (pop)
47
Ví dụ:
3 2
4 3 2
Ngăn xếp ban đầu Ngăn xếp sau khi pop()
return 4;
Đỉnh = 3
Đỉnh = 2
Trang 48Lấy thông tin đỉnh ngăn xếp
C u trúc d li u và gi i thu t – HCMUS 2012 ấ ữ ệ ả ậ
Trang 49Lấy thông tin đỉnh ngăn xếp
49
Ví dụ
4 3 2
4 3 2
Ngăn xếp ban đầu Ngăn xếp sau khi gettop()
return 4;
Đỉnh = 3 Đỉnh = 3
Trang 52⇒ Qui đ nh th t u tiên c a các phép toán ị ứ ự ư ủ
⇒ Dùng d u ngo c đ phân bi t th t th c hi n ấ ặ ể ệ ứ ự ự ệ
Trang 53Trung tố Hậu tố
A + B A B + (A+B)*C A B + C *
Trang 54Chuyển trung tố sang hậu tố
C u trúc d li u và gi i thu t – HCMUS 2012 ấ ữ ệ ả ậ
Trang 55Chuyển trung tố sang hậu tố
C u trúc d li u và gi i thu t – HCMUS 2012 ấ ữ ệ ả ậ
Trang 56Chuyển trung tố sang hậu tố
56
Ví dụ 1: P = ( A + B ) * ( C - ( D + A ) )
( A + B ) * ( C - ( D + A ) )
( (
+ ( (
+ ( (
(
* (
(
* (
(
* (
(
-* (
( - (
* (
( - (
* (
+ ( - (
* (
+ ( - (
* (
(
-*
(
Q = A B + C D A + - *
Trang 57Chuyển trung tố sang hậu tố
Trang 58Ứng dụng khác của ngăn xếp
58
Dùng biến đổi cơ số
Lượng giá biểu thức hậu tố
Trong trình biên dịch, ngăn xếp được sử dụng
để lưu môi trường các thủ tục
Dùng trong một số bài toán của lý thuyết đồ thị
Khử đệ qui đuôi
Trang 59Hàng đợi - Queue
59
Trang 61Giới thiệu
61
Giới thiệu:
Là v t ch các đ i t ậ ứ ố ượ ng làm vi c theo qui t c ệ ắ vào
tr ướ c ra tr ướ (FIFO) c
Các đ i t ố ượ ng có th đ ể ượ c thêm vào hàng đ i b t kì ợ ấ lúc nào nh ng ch có đ i t ư ỉ ố ượ ng thêm vào đ u tiên ầ
m i đớ ượ l y ra kh i hàng đ ic ấ ỏ ợ
Trang 62Các thao tác trên hàng đợi
62
Thao tác cơ bản:
Enqueue: Thêm 1 đ i t ố ượ ng vào cu i hàng đ i ố ợ
Dequeue: L y đ i t ấ ố ượ ng đ u ra kh i hàng đ i ở ầ ỏ ợ
Thao tác khác:
L u tr hàng đ i ư ữ ợ
Ki m tra hàng đ i r ng ể ợ ỗ
Ki m tra hàng đ i đ y ể ợ ầ
Trang 63Lưu trữ hàng đợi
63
Lưu trữ bằng mảng:
Khai báo m ng 1 chi u v i kích th ả ề ớ ướ ố c t i đa N.
f là đ a ch c a ph n t n m đ u, r là đ a ch c a ị ỉ ủ ầ ử ằ ở ầ ị ỉ ủ
Trang 64 Hàng đ i khi xoay vòng: ợ
Trang 66Kiểm tra hàng đợi rỗng
66
Input:
Output:
TRUE n u hàng đ i r ng ế ợ ỗ
FALSE n u hàng đ i không r ng ế ợ ỗ
Hàng đợi rỗng:
M ng: ô nh đ u tiên không ch a d li u ả ớ ầ ứ ữ ệ
Trang 67Kiểm tra hàng đợi đầy
67
Input:
Output:
TRUE n u hàng đ i đ y ế ợ ầ
FALSE n u hàng đ i không đ y ế ợ ầ
Hàng đợi đầy:
M ng: ô nh cu i hàng đ i đã ch a d li u ả ớ ố ợ ứ ữ ệ
Trang 68Thêm phần tử vào cuối hàng đợi
68
Input: giá trị cần thêm
Output:
Giải thuật thêm phần tử (EnQueue)
Ki m tra hàng đ i đã đ y ch a? ể ợ ầ ư
Trong tr ườ ng h p l u tr b ng m ng ợ ư ữ ằ ả : ki m tra đi u ể ề
ki n xoay vòng ệ
Thêm ph n t vào cu i hàng đ i ầ ử ố ợ
Trang 69Thêm phần tử vào cuối hàng đợi
Trang 70Lấy phần tử đầu ra khỏi hàng đợi
70
Input:
Output: giá trị của phần tử đầu hàng đợi
Giải thuật lấy phần tử ở đầu (DeQueue)
Ki m tra hàng đ i có r ng không? ể ợ ỗ
Xóa ph n t đ u ra kh i hàng đ i ầ ử ầ ỏ ợ
C p nh t đ a ch ph n t đ u hàng đ i ậ ậ ị ỉ ầ ử ầ ợ
Trong tr ườ ng h p l u tr b ng m ng: ợ ư ữ ằ ả ki m tra đi u ể ề
Trang 71Lấy phần tử đầu ra khỏi hàng đợi
DeQueue() = 1
Trang 72Lấy thông tin đầu hàng đợi
72
Chỉ lấy thông tin của đối tượng đầu hàng đợi
mà không hủy đối tượng khỏi hàng đợi
Input: hàng đợi
Output: giá trị của đối tượng đầu hàng đợi
Giải thuật:
Ki m tra hàng đ i r ng? ể ợ ỗ
Trang 73Lấy thông tin đầu hàng đợi
Trang 75a Bổ sung E vào hàng đợi
b Loại 2 phần tử khỏi hàng đợi
c Bổ sung I, J, K vào hàng đợi
d Loại 2 phần tử khỏi hàng đợi
e Bổ sung O vào hàng đợi
f = 1 r = 3
Trang 76Hỏi và Đáp
76