MỤC TIÊUSau chương này bạn có thể: Giải thích cấu trúc và cách làm việc của stack Biết sử dụng cấu trúc stack để giải một số bài toán Giải thích cấu trúc và cách làm việc của queue Biết
Trang 1CHƯƠNG 4 STACK và QUEUE
(6 tiết)
Trang 2MỤC TIÊU
Sau chương này bạn có thể:
Giải thích cấu trúc và cách làm việc của stack Biết sử dụng cấu trúc stack để giải một số bài toán
Giải thích cấu trúc và cách làm việc của queue Biết sử dụng cấu trúc queue để giải một số bài toán
Trang 4Ôn tập
Tìm kiếm là qua trình dựa trên một chút thông tin
(khoá tìm kiếm) đã có để xác định vị trí có thông tin cần tìm trong một nhóm trị.
Hai giải thuật tìm kiếm: Tìm kiếm tuyến tính và tìm kiếm nhị phân.
Tìm kiếm tuần tự có thể dùng cho một nhóm trị
bất kỳ.
Tìm kiếm nhị phân chỉ dùng cho nhóm trị đã có
thứ tự.
Trang 5Ôn tập
Sắp xếp là qúa trình tái bố trí các phần tử trong một nhóm trị theo một cơ chế so sánh nào đó.
Cơ chế selection sort: tìm 1 trị nhỏ nhất trong
nhóm trị còn phải sắp xếp để đưa về đầu nhóm
này.
Cơ chế Bubble sort: Hoán chuyển dần các trị nhỏ
ở dưới lên phía trên.
Cơ chế Insertion sort: Lấy 1 trị phía sau chèn vào
vị trí thích hợp trong nhóm trị đã có thứ tự ở phía trước
Trang 64.1- Giới thiệu
Mảng thông thường cho phép truy xuất bất
kỳ phần tử nào Không hạn chế truy cập.
Có những danh sách hạn chế cách truy cập Chồng(stack) đĩa chỉ cho phép truy cập 1
chiều
Hàng đợi khi mua vé là một danh sách hạn chế cách truy cập.
Trang 8Giới thiệu
Queue- Hàng đợi
Trang 9Giới thiệu
Queue- Hàng đợi
Cơ chế: Vào trước ra trước
First In First Out- FIFO
Hàng đầy
Trang 104.2- Stack
Mô tả stack
Khởi tạo 1 stack
Kiểm tra stack trống
Kiểm tra stack đầy
Thêm 1 phần tử vào stack
Lấy phần tử đỉnh stack ra
Trang 112
5 1000
3 31
0
Stack chứa một nhóm phần tử kiểu nào đó (T)
mảng
Mảng chiếm dụng bộ nhớ bao nhiêu?
Tại 1 thời điểm, vị trí trên cùng là vị trí nào?
Kỹ thuật template cho phép định nghĩa
1 tên gọi cho 1 kiểu
dữ liệu trừu tượng Khi
sử dụng sẽ
ấn định kiểu cụ thể
Bộ nhớ
template <class T> struct STACK
{ int maxSize;
T* ar;
int top;
};
Trang 124.2.2- Tác vụ khởi tạo (Init) 1 stack với MazSize phần tử
int maxSize 32
T* ar 1000 int top -1
1000
1
31
0
int maxSize
T* ar int top
Khởi tạo stack bao nhiêu phần tử ? Thí dụ: 32
Chưa có phần tử nào và 0 là vị trí hợp lệ (chỉ số đầu của mảng) nên chon -1
Trang 134.2.3- Kiểm tra stack trống (Empty)?
Stack trống là stack không
1000
1 31
0
St
Trang 144.2.4- Kiểm tra stack đầy (Full)?
Stack đầy khi chỉ số đỉnh
B
T
A 1000
1 31
0
X
Full
St
Trang 154.2.5- Thêm 1 phần tử vào stack (Push)?
Chỉ thêm vào được khi stack chưa
B A 1000
1 31
0
C
int top 2
ele St
Trang 164.2.6- Lấy phần tử đỉnh stack (Pop)?
Chỉ lấy ra được khi stack không
B A 1000
1 31
0
C
int top 1
ele St
Trang 17Cài đặt mô hình cấu trúc stack và tác vụ trên stack
Định nghĩa cấu
trúc STACK cùng
với các thao tác
trên STACK trong
file.h Khi nào cần
trước MỖI hiện
thực hàm phải khai báo lại kiểu template
tham số phải chỉ định có kiểu template
// stack.h #ifndef _STACK_H_
Trang 18int Full (STACK<T> St)
{ return St.top== (St.maxSize -1);
}
#endif
Dùng hàm memcpy
để sao chép trị thay vì phép gán để cho phép phần tử của stack có thể
là chuỗi
Trang 194.3- Một số bài toán dùng stack
Trang 204.3.1-Bài toán đổi số
Nhập 1 số long ( thí dụ nhập n=13) và cơ số (thí dụ CoSo=2) , xuất biểu diễn của số theo cơ số này.
0 1
1 0 1 1
0
1 0
1
1 0 1 1
Ngưng chia
Lấy ra
Trang 21Chỉ biên dịch khi file.cpp đang hiện hành- Không biên dịch file.h
Trang 224.3.2- Bài toán đảo chuỗi S
Chuỗi nhập: qwert Chuỗi xuất: trewq
Thư viện string.h có hàm strrev (string reverse) làm điều này.
Có thể tự xây dựng đảo chuỗi bằng stack các ký tự
q w e r t
q w e
q w e r t
Pop(St,c);
printf(“%c”,c); }
Trang 234.3.3-Bài toán tính trị biểu thức dạng hậu tố
Lewinski đã chứng minh rằng mọi biểu thức đều có thể viết dưới dạng hậu tố (postfix
notation, toán tử đặt sau toán hạng) và tính toán từ trái sang phải.
Thí dụ: (3+5)*2 3 5+2* Lấy 3 với 5 cộng nhau rồi lấy 2 nhân vào.
Thí dụ ((3+5)*2)3 3 5+2*3$ với $ là ký
hiệu của toán tử lũy thừa (do ta chọn).
Thí dụ: ((3*4)+(5*6)+(7*8))*3
3 4*5 6*+7 8*+3*
Trang 24Bài toán tính trị biểu thức dạng hậu tố
Mô tả biểu thức hậu tố: Chuỗi ký số và toán tử
Để phân cách các toán hạng, nên dùng cặp
móc để dễ truy xuất 1 toán hạng trong chuỗi Nhờ vậy, có thể nhập biểu thức số thực và cả
số âm
Thí dụ: (-3.5)(4.7)+(7.2)*(-5.6)* để mô tả
cho
((-3.5)+(4.7))*(7.2)*(-5.6)
Đọc 1 toán hạng là đọc 1 chuỗi con từ móc
mở đến móc đóng, đổi chuỗi số này thành số: Thí dụ: “(-3.5)” “-3.5” -3.5
Trang 25Bài toán tính trị biểu thức dạng hậu tố
12 30
Xong
Luôn luôn thực thi 1 phép toán với
2 toán hạng lấy
từ Stack
Trang 26Bài toán tính trị biểu thức dạng hậu tố
Tác vụ kiểm tra 1 ký tự có là toán tử?
Khi duyệt biểu thức, nếu đó là toán tử thì
lậy 2 trị từ stack ra để tính toán Ngược lại
lấy toán hạng từ biểu thức rồi đưa vào stack.
Trang 27Bài toán tính trị biểu thức dạng hậu tố
Tác vụ lấy 1 toán hạng từ vị trí thứ i trong biểu thức.
Trang 28Bài toán tính trị biểu thức dạng hậu tố
Tác vụ tính trị 1 phép toán
Trang 29Bài toán tính trị biểu thức dạng hậu tố
Tác vụ tính trị cả biểu thức
Toán hạng 2 ở trên, toán hạng 1 ở dưới trong stack
Trang 30Bài toán tính trị biểu thức dạng hậu tố
Trang 31Biểu thức tiền tố (prefix notation) được Jan Lukasiewicz, một nhà logic học người Balan giới thiệu năm 1929, nên còn gọi là dạng biểu diễn Balan của biểu thức : (a+b)*(c–d) *+ab-cd Đây chính là dạng viết ngược của postfix notation
((3-5)*2)3 35-2*3$ (dạng hậu tố)
$3*2-35 (dạng tiền tố)
Viết chương trình tính trị của biểu thức tiền tố.
Gợi ý: Tương tự bài toán tính trị
của biểu thức hậu tố, chỉ khác là
phải xét chuỗi từ sau ra trước.
Tự trả lời
4.3.4-Bài toán tính trị biểu thức dạng tiền tố
Trang 344.4.2- Khởi tạo hàng đợi với MaxSize phần tử
int maxSize
T* ar int rear Q
ar 1000 rear 0 Q
Khởi tạo với MaxSize =32 phần tử
0
maxSize-1
1000
maxSize 32
Trang 354.4.3- Kiểm tra hàng có trống?
ar 1000 rear 0 Q
0
maxSize-1
1000
maxSize 32
Trang 364.4.4- Kiểm tra hàng có đầy?
ar 1000 rear 32 Q
5
120
Trang 374.4.5- Thêm 1 phần tử vào hàng
ar 1000 rear 1 Q
1
9
Trang 384.4.6- Lấy 1 phần tử ra khỏi hàng
ar 1000 rear 32 Q
0 31
maxSize 32
1 2
ele rear 31
120
7 9
5
Trang 39Sử dụng Queue
Quản lý in ấn.
Quản lý qúa trình của hệ điều hành.
Trang 40Thí dụ 1: Queue các phần tử int
Trang 41Thí dụ 2: Queue in ấn
Tên máy
Số trang cần in
Trang 42Bài tập về queue.
Mỗi máy trong môi trường Internet được nhận diện bằng một địa chỉ IP (Internet Protocol Address) gồm 4 byte Mô tả 4
byte này theo dạng: 202.168.9.0 Ba byte đầu của IP address
dùng để nhận dạng mạng mà máy này có kết nối (vì Internet là mạng của các mạng), byte cuối cùng dùng để nhận dạng máy tính này trong mạng.
Một máy client có thể truy xuất từ server 1 tài nguyên (1 file) Một server nhận nhiều yêu cầu từ client.
Viết chương trình cho biết server sẽ lần lượt phục vụ client
theo thứ tự nào và tài nguyên nào.
Trang 43Tóm tắt
Stack: Cấu trúc danh sách chứa 1 nhóm các phần
tử làm việc theo cơ chế vào sau ra trước (Last In
First Out).
Queue: Cấu trúc danh sách chứa 1 nhóm các phần
tử làm việc theo cơ chế vào trước ra trước (First In First Out).
Các tác vụ trên Stack và Queue: Khởi tạo, Kiểm tra trống, kiểm tra đầy, thêm 1 phần tử, Lấy 1 phần tử ra.
Có thể dùng mảng để mô tả danh sách các phần tử của stack và queue.
Trang 44Tóm tắt
Dùng kỹ thuật template của C++ giúp hiện thực
cấu trúc mức khái quát với khai báo template
<class T>, T là tên gọi do ta tự đặt
Phải khai báo template <class T>lại trước mỗi hiện
thực hàm có dùng kiểu trừu tượng T này.
Khi giải bài toán cụ thể T sẽ là một kiểu dữ liệu
cụ thể Trình biên dịch sẽ áp dụng kiểu dữ liệu cụ thể cho template này.
Trang 45Xin cám ơn