SlideShare a Scribd company logo
1 of 36
Download to read offline
Ngăn xếp và Hàng đợi
(Stacks and Queues)
Bài giảng môn Cấu trúc dữ liệu và giải thuật
Khoa Công nghệ thông tin
Trường Đại học Thủy Lợi
Nội dung
1. Ngăn xếp
2. Hàng đợi
2
1. Ngăn xếp
3
Ngăn xếp
• Một danh sách các phần tử theo kiểu vào sau ra trước:
LIFO (Last In First Out)
• Ba thao tác chính, xảy ra ở đỉnh ngăn xếp và chỉ mất thời gian
O(1):
− push: Thêm phần tử.
− pop: Xóa phần tử.
− top: Trả về phần tử.
(pop và top có thể kết hợp
thành một thao tác)
• Các thao tác khác:
− Lấy kích thước
− Kiểm tra rỗng
4
Cài đặt ngăn xếp – cách 1
• Cài đặt bằng danh sách liên kết đơn:
• Cài đặt các thao tác:
− push(e): Gọi thao tác pushFront(e) của DSLK đơn.
− pop: Gọi thao tác popFront của DSLK đơn.
− top: Gọi thao tác front của DSLK đơn.
head
5
Cài đặt ngăn xếp – cách 2
• Cài đặt bằng mảng:
• Cài đặt các thao tác:
− push(e): topOfStack++, theArray[topOfStack] = e
− pop: topOfStack--
− top: Trả về theArray[topOfStack]
2 8 3 5
theArray
topOfStack (= 3)
0 1 2 3 4 5 6 7 8
6
Một số ứng dụng của ngăn xếp
• Cân bằng thẻ (tag) trong trang HTML
• Định giá biểu thức hậu tố
• Ngăn xếp lời gọi hàm (xem trong sách)
7
Cân bằng thẻ trong trang HTML
Kiểm tra hai yêu cầu sau đây:
1. Mỗi thẻ mở phải có thẻ đóng tương ứng:
<b> something </b>
2. Hai cặp thẻ khác nhau có thể lồng nhau nhưng
không được bắt chéo nhau:
<b><i> something </i></b> → OK
<b><i> something </b></i> → Lỗi
8
9
Ban đầu ngăn
xếp rỗng
10
Gặp thẻ mở, thêm
nó vào ngăn xếp
11
Gặp thẻ mở, thêm
nó vào ngăn xếp
12
Gặp thẻ mở, thêm
nó vào ngăn xếp
13
Gặp nội dung,
không làm gì cả
14
Gặp thẻ đóng, lấy một thẻ
ra khỏi ngăn xếp, xem có
khớp nhau không
15
Gặp thẻ đóng, lấy một thẻ
ra khỏi ngăn xếp, xem có
khớp nhau không
Khi đã quét hết trang
HTML và ngăn xếp rỗng,
trang HTML là chuẩn!
Định giá biểu thức hậu tố
• Giả sử phải định giá biểu thức trung tố sau:
4,99 ∗ 1,06 + 5,99 + 6,99 ∗ 1,06
− Máy tính khoa học sẽ cho kết quả 18,69 → đúng.
− Máy tính giản đơn (tính tuần tự từ trái sang phải) sẽ cho kết quả
19,37 → sai.
• Nếu viết lại biểu thức trên dưới dạng hậu tố (toán tử nằm sau các
toán hạng của nó) rồi áp dụng ngăn xếp, ta chỉ cần tính tuần tự từ
trái sang phải mà không cần quan tâm độ ưu tiên của các toán tử:
4,99 1,06 ∗ 5,99 + 6,99 1,06 ∗ +
(Có thể dùng ngăn xếp để chuyển đổi biểu thức trung tố thành biểu
thức hậu tố → xem thêm trong sách)
16
Định giá biểu thức hậu tố (tiếp)
Duyệt các thành phần (toán hạng/toán tử) trong biểu
thức hậu tố từ trái sang phải:
• Gặp toán hạng:
− Đặt nó vào ngăn xếp.
• Gặp toán tử:
1. Lấy hai toán hạng ra khỏi ngăn xếp và áp dụng
toán tử lên hai toán hạng đó.
2. Đặt kết quả tính toán vào ngăn xếp.
17
Ví dụ định giá biểu thức hậu tố
• Định giá biểu thức sau: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đặt bốn toán hạng đầu tiên vào ngăn xếp.
18
6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “+”, lấy 3 và 2 ra, cộng lại được 5, đặt 5 vào ngăn
xếp.
19
6 5 2 3 + 8 ∗ + 3 + ∗
• Đặt 8 vào ngăn xếp.
20
6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “∗”, lấy 8 và 5 ra, nhân vào được 40, đặt 40 vào
ngăn xếp.
21
6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “+”, lấy 40 và 5 ra, cộng lại được 45, đặt 45 vào
ngăn xếp.
22
6 5 2 3 + 8 ∗ + 3 + ∗
• Đặt 3 vào ngăn xếp.
23
6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “+”, lấy 3 và 45 ra, cộng lại được 48, đặt 48 vào
ngăn xếp.
24
6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “∗”, lấy 48 và 6 ra, nhân vào được 288, đặt 288 vào ngăn
xếp.
• Khi đã quét hết biểu thức, giá trị duy nhất còn lại trong ngăn
xếp (288) chính là giá trị tính được của biểu thức.
Thời gian định giá biểu thức hậu tố là O(n), với n là số toán hạng
và toán tử có trong biểu thức.
25
2. Hàng đợi
26
Hàng đợi
• Một danh sách các phần tử theo kiểu vào trước ra trước:
FIFO (First In First Out)
• Hai thao tác chính, chỉ mất thời gian O(1):
− enqueue: Chèn phần tử vào cuối danh sách.
− dequeue: Xóa phần tử ở đầu danh sách.
2 8 4 e
3 5 7
dequeue ở đầu enqueue(e) ở cuối
27
Cài đặt hàng đợi
• Như trường hợp ngăn xếp, ta có thể dùng mảng hoặc danh
sách liên kết đơn để cài đặt hàng đợi.
• Ở đây, ta chỉ xem xét cách cài đặt dùng mảng:
− theArray là mảng chứa các phần tử;
− currentSize là số phần tử hiện có trong hàng đợi;
− front và back giữ vị trí của phần tử đầu và cuối hàng đợi; vị
trí nằm trong khoảng từ 0 đến chiều dài của mảng trừ đi 1.
theArray
currentSize = 4
28
Cài đặt hàng đợi dùng mảng
• enqueue(e): back++, theArray[back] = e, currentSize++
• dequeue: front++, currentSize--
• Hàng đợi này chỉ chứa được 10 phần tử → nhanh chóng đầy?
− Trên thực tế, hàng đợi thường chỉ cần nhỏ vì dequeue sẽ xảy ra
đều đặn nhằm lấy từng phần tử ra khỏi hàng đợi để xử lý.
• Dù vậy, trong ví dụ trên, sau 10 lần enqueue, back ở vị trí cuối cùng
thì sẽ không thể enqueue thêm → giải pháp mảng vòng tròn!
theArray
currentSize = 4
29
Mảng vòng tròn
Trạng thái hiện tại
Sau enqueue(1)
30
Mảng vòng tròn
Sau dequeue (trả về 2)
Sau enqueue(3)
31
Mảng vòng tròn
Sau dequeue (trả về 1)
Sau dequeue (trả về 4)
32
Mảng vòng tròn
Chú ý: Vì front có thể nằm trước hoặc sau back, nên
không thể biết khi nào hàng đợi rỗng nếu chỉ căn cứ
vào front và back → phải kiểm tra currentSize!
Sau dequeue (trả về 3)
33
Một số ứng dụng của hàng đợi
• Xếp các tác vụ in ấn vào hàng đợi khi chúng được gửi
tới cùng một máy in.
− Trên thực tế, ta có thể hủy một tác vụ in nằm giữa
hàng đợi → không phải hàng đợi đúng nghĩa!
• Xếp các cuộc gọi tới tổng đài chăm sóc khách hàng
vào hàng đợi khi tất cả các nhân viên tổng đài đều
đang bận.
• Xếp các gói tin gửi từ nguồn tới đích (trong mạng máy
tính) vào hàng đợi (ở đích) để chờ xử lý.
34
Bài tập
1. Nêu cách thực hiện các thao tác lấy kích thước và kiểm
tra rỗng của ngăn xếp trong các trường hợp sau:
(a) Cài đặt ngăn xếp bằng danh sách liên kết đơn.
(b) Cài đặt ngăn xếp bằng mảng.
2. Đề xuất cách thực hiện hai ngăn xếp dùng chung một
mảng.
3. Đề xuất cấu trúc dữ liệu hỗ trợ hai thao tác push và pop,
như trong trường hợp ngăn xếp, nhưng hỗ trợ thêm thao
tác findMin trả về phần tử nhỏ nhất trong thời gian O(1).
35
Bài tập
4. Xét một hàng đợi kiểu mảng vòng tròn. Hãy chỉ ra dãy
thao tác enqueue và dequeue phải thực hiện để chuyển
hàng đợi từ trạng thái 1 sang trạng thái 2:
5. Đề xuất cách thực hiện hàng đợi dùng danh sách liên kết
đơn.
36
12 35
front back
17 18 35 26
front
back
(1) (2)

More Related Content

Similar to CTDL-04-Ngan xep va Hang doi (1).pdf

Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPTBài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPTMasterCode.vn
 
Cơ sở dữ liệu và giải thuật Vũ Song Tùng
Cơ sở dữ liệu và giải thuật Vũ Song TùngCơ sở dữ liệu và giải thuật Vũ Song Tùng
Cơ sở dữ liệu và giải thuật Vũ Song Tùngdtrhung_vtbk
 
Oop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátOop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátTráng Hà Viết
 
Bai giang stack c++
Bai giang stack c++Bai giang stack c++
Bai giang stack c++ssuserd84133
 
Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Hồ Lợi
 
Tuan1_GioiThieu.pdf
Tuan1_GioiThieu.pdfTuan1_GioiThieu.pdf
Tuan1_GioiThieu.pdfNguynVnTun74
 
Cấu trúc dữ liệu cơ bản 2
Cấu trúc dữ liệu cơ bản 2Cấu trúc dữ liệu cơ bản 2
Cấu trúc dữ liệu cơ bản 2Hồ Lợi
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTMasterCode.vn
 
Bài tập CTDL và GT 13
Bài tập CTDL và GT 13Bài tập CTDL và GT 13
Bài tập CTDL và GT 13Hồ Lợi
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Hồ Lợi
 
csdl bai-thuchanh_02
csdl bai-thuchanh_02csdl bai-thuchanh_02
csdl bai-thuchanh_02kikihoho
 
Bai10 stack queue
Bai10 stack queueBai10 stack queue
Bai10 stack queueHồ Lợi
 

Similar to CTDL-04-Ngan xep va Hang doi (1).pdf (20)

Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPTBài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
 
Cơ sở dữ liệu và giải thuật Vũ Song Tùng
Cơ sở dữ liệu và giải thuật Vũ Song TùngCơ sở dữ liệu và giải thuật Vũ Song Tùng
Cơ sở dữ liệu và giải thuật Vũ Song Tùng
 
Oop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quátOop unit 09 lập trình tổng quát
Oop unit 09 lập trình tổng quát
 
Thu vien chuan c++
Thu vien chuan c++Thu vien chuan c++
Thu vien chuan c++
 
D05 stl
D05 stlD05 stl
D05 stl
 
Baitap ktlt
Baitap ktltBaitap ktlt
Baitap ktlt
 
Bai giang stack c++
Bai giang stack c++Bai giang stack c++
Bai giang stack c++
 
Bài tập CTDL và GT 12
Bài tập CTDL và GT 12Bài tập CTDL và GT 12
Bài tập CTDL và GT 12
 
Baitap ktlt
Baitap ktltBaitap ktlt
Baitap ktlt
 
Chủ đề 4
Chủ đề 4Chủ đề 4
Chủ đề 4
 
Tip oracle
Tip oracleTip oracle
Tip oracle
 
Tuan1_GioiThieu.pdf
Tuan1_GioiThieu.pdfTuan1_GioiThieu.pdf
Tuan1_GioiThieu.pdf
 
Cấu trúc dữ liệu cơ bản 2
Cấu trúc dữ liệu cơ bản 2Cấu trúc dữ liệu cơ bản 2
Cấu trúc dữ liệu cơ bản 2
 
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPTBài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
 
Bài tập CTDL và GT 13
Bài tập CTDL và GT 13Bài tập CTDL và GT 13
Bài tập CTDL và GT 13
 
Bài tập CTDL và GT 1
Bài tập CTDL và GT 1Bài tập CTDL và GT 1
Bài tập CTDL và GT 1
 
csdl bai-thuchanh_02
csdl bai-thuchanh_02csdl bai-thuchanh_02
csdl bai-thuchanh_02
 
7 stl c++
7   stl c++7   stl c++
7 stl c++
 
Phan 4
Phan 4Phan 4
Phan 4
 
Bai10 stack queue
Bai10 stack queueBai10 stack queue
Bai10 stack queue
 

More from LmTrn286060

Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLmTrn286060
 
banking-infogrfwecưevwevvwervwevwevqwewf
banking-infogrfwecưevwevvwervwevwevqwewfbanking-infogrfwecưevwevvwervwevwevqwewf
banking-infogrfwecưevwevvwervwevwevqwewfLmTrn286060
 
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLmTrn286060
 
tt-hcm-chuong-4-23.ppt
tt-hcm-chuong-4-23.ppttt-hcm-chuong-4-23.ppt
tt-hcm-chuong-4-23.pptLmTrn286060
 
tt-hcm-chuong-1-23.ppt
tt-hcm-chuong-1-23.ppttt-hcm-chuong-1-23.ppt
tt-hcm-chuong-1-23.pptLmTrn286060
 
chuong-3-lsd.pptx
chuong-3-lsd.pptxchuong-3-lsd.pptx
chuong-3-lsd.pptxLmTrn286060
 
KTCT. CHƯƠNG 3.OK.pptx
KTCT. CHƯƠNG 3.OK.pptxKTCT. CHƯƠNG 3.OK.pptx
KTCT. CHƯƠNG 3.OK.pptxLmTrn286060
 
KTCT. Chương 1.OK.pptx
KTCT. Chương 1.OK.pptxKTCT. Chương 1.OK.pptx
KTCT. Chương 1.OK.pptxLmTrn286060
 
C 3. Quản lý bộ nhớ full.pdf
C 3. Quản lý bộ nhớ full.pdfC 3. Quản lý bộ nhớ full.pdf
C 3. Quản lý bộ nhớ full.pdfLmTrn286060
 

More from LmTrn286060 (10)

Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
 
banking-infogrfwecưevwevvwervwevwevqwewf
banking-infogrfwecưevwevvwervwevwevqwewfbanking-infogrfwecưevwevvwervwevwevqwewf
banking-infogrfwecưevwevvwervwevwevqwewf
 
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptxLập trình hướng đối tượng Chương 6 Design Pattern.pptx
Lập trình hướng đối tượng Chương 6 Design Pattern.pptx
 
02-BGP.pdf
02-BGP.pdf02-BGP.pdf
02-BGP.pdf
 
tt-hcm-chuong-4-23.ppt
tt-hcm-chuong-4-23.ppttt-hcm-chuong-4-23.ppt
tt-hcm-chuong-4-23.ppt
 
tt-hcm-chuong-1-23.ppt
tt-hcm-chuong-1-23.ppttt-hcm-chuong-1-23.ppt
tt-hcm-chuong-1-23.ppt
 
chuong-3-lsd.pptx
chuong-3-lsd.pptxchuong-3-lsd.pptx
chuong-3-lsd.pptx
 
KTCT. CHƯƠNG 3.OK.pptx
KTCT. CHƯƠNG 3.OK.pptxKTCT. CHƯƠNG 3.OK.pptx
KTCT. CHƯƠNG 3.OK.pptx
 
KTCT. Chương 1.OK.pptx
KTCT. Chương 1.OK.pptxKTCT. Chương 1.OK.pptx
KTCT. Chương 1.OK.pptx
 
C 3. Quản lý bộ nhớ full.pdf
C 3. Quản lý bộ nhớ full.pdfC 3. Quản lý bộ nhớ full.pdf
C 3. Quản lý bộ nhớ full.pdf
 

CTDL-04-Ngan xep va Hang doi (1).pdf

  • 1. Ngăn xếp và Hàng đợi (Stacks and Queues) Bài giảng môn Cấu trúc dữ liệu và giải thuật Khoa Công nghệ thông tin Trường Đại học Thủy Lợi
  • 2. Nội dung 1. Ngăn xếp 2. Hàng đợi 2
  • 4. Ngăn xếp • Một danh sách các phần tử theo kiểu vào sau ra trước: LIFO (Last In First Out) • Ba thao tác chính, xảy ra ở đỉnh ngăn xếp và chỉ mất thời gian O(1): − push: Thêm phần tử. − pop: Xóa phần tử. − top: Trả về phần tử. (pop và top có thể kết hợp thành một thao tác) • Các thao tác khác: − Lấy kích thước − Kiểm tra rỗng 4
  • 5. Cài đặt ngăn xếp – cách 1 • Cài đặt bằng danh sách liên kết đơn: • Cài đặt các thao tác: − push(e): Gọi thao tác pushFront(e) của DSLK đơn. − pop: Gọi thao tác popFront của DSLK đơn. − top: Gọi thao tác front của DSLK đơn. head 5
  • 6. Cài đặt ngăn xếp – cách 2 • Cài đặt bằng mảng: • Cài đặt các thao tác: − push(e): topOfStack++, theArray[topOfStack] = e − pop: topOfStack-- − top: Trả về theArray[topOfStack] 2 8 3 5 theArray topOfStack (= 3) 0 1 2 3 4 5 6 7 8 6
  • 7. Một số ứng dụng của ngăn xếp • Cân bằng thẻ (tag) trong trang HTML • Định giá biểu thức hậu tố • Ngăn xếp lời gọi hàm (xem trong sách) 7
  • 8. Cân bằng thẻ trong trang HTML Kiểm tra hai yêu cầu sau đây: 1. Mỗi thẻ mở phải có thẻ đóng tương ứng: <b> something </b> 2. Hai cặp thẻ khác nhau có thể lồng nhau nhưng không được bắt chéo nhau: <b><i> something </i></b> → OK <b><i> something </b></i> → Lỗi 8
  • 10. 10 Gặp thẻ mở, thêm nó vào ngăn xếp
  • 11. 11 Gặp thẻ mở, thêm nó vào ngăn xếp
  • 12. 12 Gặp thẻ mở, thêm nó vào ngăn xếp
  • 14. 14 Gặp thẻ đóng, lấy một thẻ ra khỏi ngăn xếp, xem có khớp nhau không
  • 15. 15 Gặp thẻ đóng, lấy một thẻ ra khỏi ngăn xếp, xem có khớp nhau không Khi đã quét hết trang HTML và ngăn xếp rỗng, trang HTML là chuẩn!
  • 16. Định giá biểu thức hậu tố • Giả sử phải định giá biểu thức trung tố sau: 4,99 ∗ 1,06 + 5,99 + 6,99 ∗ 1,06 − Máy tính khoa học sẽ cho kết quả 18,69 → đúng. − Máy tính giản đơn (tính tuần tự từ trái sang phải) sẽ cho kết quả 19,37 → sai. • Nếu viết lại biểu thức trên dưới dạng hậu tố (toán tử nằm sau các toán hạng của nó) rồi áp dụng ngăn xếp, ta chỉ cần tính tuần tự từ trái sang phải mà không cần quan tâm độ ưu tiên của các toán tử: 4,99 1,06 ∗ 5,99 + 6,99 1,06 ∗ + (Có thể dùng ngăn xếp để chuyển đổi biểu thức trung tố thành biểu thức hậu tố → xem thêm trong sách) 16
  • 17. Định giá biểu thức hậu tố (tiếp) Duyệt các thành phần (toán hạng/toán tử) trong biểu thức hậu tố từ trái sang phải: • Gặp toán hạng: − Đặt nó vào ngăn xếp. • Gặp toán tử: 1. Lấy hai toán hạng ra khỏi ngăn xếp và áp dụng toán tử lên hai toán hạng đó. 2. Đặt kết quả tính toán vào ngăn xếp. 17
  • 18. Ví dụ định giá biểu thức hậu tố • Định giá biểu thức sau: 6 5 2 3 + 8 ∗ + 3 + ∗ • Đặt bốn toán hạng đầu tiên vào ngăn xếp. 18
  • 19. 6 5 2 3 + 8 ∗ + 3 + ∗ • Đọc “+”, lấy 3 và 2 ra, cộng lại được 5, đặt 5 vào ngăn xếp. 19
  • 20. 6 5 2 3 + 8 ∗ + 3 + ∗ • Đặt 8 vào ngăn xếp. 20
  • 21. 6 5 2 3 + 8 ∗ + 3 + ∗ • Đọc “∗”, lấy 8 và 5 ra, nhân vào được 40, đặt 40 vào ngăn xếp. 21
  • 22. 6 5 2 3 + 8 ∗ + 3 + ∗ • Đọc “+”, lấy 40 và 5 ra, cộng lại được 45, đặt 45 vào ngăn xếp. 22
  • 23. 6 5 2 3 + 8 ∗ + 3 + ∗ • Đặt 3 vào ngăn xếp. 23
  • 24. 6 5 2 3 + 8 ∗ + 3 + ∗ • Đọc “+”, lấy 3 và 45 ra, cộng lại được 48, đặt 48 vào ngăn xếp. 24
  • 25. 6 5 2 3 + 8 ∗ + 3 + ∗ • Đọc “∗”, lấy 48 và 6 ra, nhân vào được 288, đặt 288 vào ngăn xếp. • Khi đã quét hết biểu thức, giá trị duy nhất còn lại trong ngăn xếp (288) chính là giá trị tính được của biểu thức. Thời gian định giá biểu thức hậu tố là O(n), với n là số toán hạng và toán tử có trong biểu thức. 25
  • 27. Hàng đợi • Một danh sách các phần tử theo kiểu vào trước ra trước: FIFO (First In First Out) • Hai thao tác chính, chỉ mất thời gian O(1): − enqueue: Chèn phần tử vào cuối danh sách. − dequeue: Xóa phần tử ở đầu danh sách. 2 8 4 e 3 5 7 dequeue ở đầu enqueue(e) ở cuối 27
  • 28. Cài đặt hàng đợi • Như trường hợp ngăn xếp, ta có thể dùng mảng hoặc danh sách liên kết đơn để cài đặt hàng đợi. • Ở đây, ta chỉ xem xét cách cài đặt dùng mảng: − theArray là mảng chứa các phần tử; − currentSize là số phần tử hiện có trong hàng đợi; − front và back giữ vị trí của phần tử đầu và cuối hàng đợi; vị trí nằm trong khoảng từ 0 đến chiều dài của mảng trừ đi 1. theArray currentSize = 4 28
  • 29. Cài đặt hàng đợi dùng mảng • enqueue(e): back++, theArray[back] = e, currentSize++ • dequeue: front++, currentSize-- • Hàng đợi này chỉ chứa được 10 phần tử → nhanh chóng đầy? − Trên thực tế, hàng đợi thường chỉ cần nhỏ vì dequeue sẽ xảy ra đều đặn nhằm lấy từng phần tử ra khỏi hàng đợi để xử lý. • Dù vậy, trong ví dụ trên, sau 10 lần enqueue, back ở vị trí cuối cùng thì sẽ không thể enqueue thêm → giải pháp mảng vòng tròn! theArray currentSize = 4 29
  • 30. Mảng vòng tròn Trạng thái hiện tại Sau enqueue(1) 30
  • 31. Mảng vòng tròn Sau dequeue (trả về 2) Sau enqueue(3) 31
  • 32. Mảng vòng tròn Sau dequeue (trả về 1) Sau dequeue (trả về 4) 32
  • 33. Mảng vòng tròn Chú ý: Vì front có thể nằm trước hoặc sau back, nên không thể biết khi nào hàng đợi rỗng nếu chỉ căn cứ vào front và back → phải kiểm tra currentSize! Sau dequeue (trả về 3) 33
  • 34. Một số ứng dụng của hàng đợi • Xếp các tác vụ in ấn vào hàng đợi khi chúng được gửi tới cùng một máy in. − Trên thực tế, ta có thể hủy một tác vụ in nằm giữa hàng đợi → không phải hàng đợi đúng nghĩa! • Xếp các cuộc gọi tới tổng đài chăm sóc khách hàng vào hàng đợi khi tất cả các nhân viên tổng đài đều đang bận. • Xếp các gói tin gửi từ nguồn tới đích (trong mạng máy tính) vào hàng đợi (ở đích) để chờ xử lý. 34
  • 35. Bài tập 1. Nêu cách thực hiện các thao tác lấy kích thước và kiểm tra rỗng của ngăn xếp trong các trường hợp sau: (a) Cài đặt ngăn xếp bằng danh sách liên kết đơn. (b) Cài đặt ngăn xếp bằng mảng. 2. Đề xuất cách thực hiện hai ngăn xếp dùng chung một mảng. 3. Đề xuất cấu trúc dữ liệu hỗ trợ hai thao tác push và pop, như trong trường hợp ngăn xếp, nhưng hỗ trợ thêm thao tác findMin trả về phần tử nhỏ nhất trong thời gian O(1). 35
  • 36. Bài tập 4. Xét một hàng đợi kiểu mảng vòng tròn. Hãy chỉ ra dãy thao tác enqueue và dequeue phải thực hiện để chuyển hàng đợi từ trạng thái 1 sang trạng thái 2: 5. Đề xuất cách thực hiện hàng đợi dùng danh sách liên kết đơn. 36 12 35 front back 17 18 35 26 front back (1) (2)