Trường Đại học Khoa học Tự nhiên
Khoa Công nghệ thông tin
KỸ THUẬT LẬP TRÌNH
1
Nội dung
Ngăn xếp (stack)
Giới thiệu
Các thao tác cơ bản
Đổi cơ số
Ký pháp Ba Lan
Hàng đợi (queue)
Giới thiệu
Các thao tác cơ bản
Ứng dụng
2
Giới thiệu
Một số hình ảnh thông dụng:
Một chồng sách vở ở trên bàn
Một chồng đĩa
Cơ cấu của một hộp chứa đạn súng trường.
Nhận xét gì từ các ví dụ trên?
3
Giới thiệu
Định nghĩa:
Ngăn xếp là cấu trúc 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.
Đỉnh
6
5
4
3
2
Đáy
4
Các thao tác trên ngăn xếp
Lưu trữ ngăn xếp
Kiểm tra ngăn xếp rỗng
Thêm 1 phần tử vào ngăn xếp
Lấy 1 phần tử ra khỏi ngăn xếp
Lấy thông tin của phần tử đầu ngăn xếp
5
Lưu trữ ngăn xếp bằng DSLK
Thêm vào đầu danh sách (AddHead): phần tử
mới thêm nằm ở đầu danh sách
Truy xuất danh sách: Truy xuất phần tử nằm
đầu trước
=> Thích hợp với tính chất của ngăn xếp
12
99
37
6
Kiểm tra ngăn xếp rỗng
Ngăn xếp rỗng khi không chứa phần tử nào (DS
rỗng)
Khai báo:
• typedef NODE* STACK;
BOOL IsEmpty(STACK);
BOOL IsEmpty(STACK Stack )
{
if(Stack==NULL)
return TRUE;
return FALSE;
}
7
Kiểm tra ngăn xếp đầy
Ngăn xếp đầy khi không thể cấp phát thêm vùng
nhớ
Khi thêm 1 phần tử vào ngăn xếp, nếu không
cấp phát được vùng nhớ -> Thông báo ngăn
xếp đầy
8
Thêm 1 phần tử
Khai báo
int Push (NODE*& pHead, NODE* x)
Giải thuật:
Tương tự thao tác thêm đầu (AddHead)
9
Thêm 1 phần tử
int Push (NODE*& pHead, NODE* x)
{
// bổ sung (thêm) phần tử mới
return 1;
}
4
3
2
Đỉnh
(pHead)
Ngăn xếp ban
đầu
5
Đỉnh
4
3
2
Ngăn xếp sau khi
Push(5)
10
Lấy 1 phần tử ra khỏi ngăn xếp
Lấy đối tượng ở đầu ngăn xếp ra khỏi ngăn xếp
và trả về giá trị của đối tượng đó.
Nếu stack rỗng? -> báo lỗi
Khai báo hàm:
Data Pop(NODE*& pHead);
11
Lấy 1 phần tử ra khỏi ngăn xếp
Thuật toán:
Kiểm tra ngăn xếp rỗng hay không?
Nếu không:
• Ghi nhận giá trị của phần tử ở đầu ngăn xếp
• Xóa phần tử đầu ra khỏi ngăn xếp
• Trả về giá trị đã ghi nhận
4
3
2
ngăn xếp ban
đầu
Đỉnh
4
3
2
Đỉnh
ngăn xếp sau khi pop()
return 4;
12
Lấy 1 phần tử ra khỏi ngăn xếp
Data Pop (NODE*& pHead)
{
//kiểm tra ngăn xếp rỗng?
if (__________)
return -1;
//ghi nhận giá trị đầu ngăn xếp
Data x = pHead -> data;
//xóa đầu ngăn xếp …
//trả về giá trị đã ghi nhận
return _______;
}
13
Lấy thông tin của phần tử đầu ngăn xếp
Chỉ lấy giá trị của phần tử đầu mà không hủy nó
khỏi ngăn xếp.
Khai báo:
Data Top(NODE* pHead)
{
if(< ngăn xếp không rỗng>)
return _______;
}
14
Bài tập
Cho biết nội dung của stack sau mỗi thao tác
trong dãy:
EAS*Y**QUE***ST***I*ON
Một chữ cái tượng trưng cho thao tác thêm chữ
cái đó vào stack, dấu * tượng trưng cho thao tác
lấy nội dung một phần tử trong stack in lên màn
hình.
Cho biết kết quả xuất ra màn hình sau khi hoàn
tất chuỗi trên?
15
Bài tập
Cho biết nội dung của stack và giá trị của các
biến sau khi thực hiện các thao tác sau: A= 5, B
= 3, C= 7
a. Tạo stack
b. Push A
c. Push C*C
b. Pop và lưu trữ vào B
c. Push B+A
d. Pop và lưu trữ vào A
e. Pop và lưu trữ vào B
16
Các thao tác trên Mảng 1 chiều
Bài tập: cài đặt lại các thao tác khi lưu trữ stack
bằng mảng 1 chiều (sinh viên tự tìm hiểu)
17
Đổi cơ số
Biểu diễn số:
Hệ thập phân: 271 = 2 * 102 + 7 * 101 + 1 * 100
Hệ nhị phân:
110110 = 1* 25 + 1 * 24 + 0 * 23 + 1 * 22 + 1 * 21 + 0 * 20
Qui tắc đổi từ thập phân sang cơ số n:
Chia liên tiếp số cần đổi cho n.
Lấy số dư (các số
18
Đổi cơ số
Ví dụ: đổi số 215 sang nhị phân
215
2
1
107
2
1
53
2
1
26
2
0
13
2
1
6
2
0
3
2
1
1
2
1
0
11010111
19
Đổi cơ số
Nhận xét? Số dư tạo ra sau thì được hiển thị
trước -> phù hợp với cơ chế hoạt động của stack
-> dùng stack để lưu trữ các số dư sau mỗi
phép chia.
Ví dụ: đổi 19 sang nhị phân
PUSH
1
POP
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
1
1
20
Đổi cơ số
Giải thuật chuyển đổi số thập phân n sang cơ số
base
void ChangeBase (int n, int base)
{
while(n!=0)
{
//tính số dư của phép chia
//push số dư vào stack
n= n/base;
}
while (stack chưa rỗng)
{
//in ra màn hình giá trị của phần tử được pop từ stack
}
}
21
Đổi cơ số
Bài tập: hãy biến đổi số thập phân 347 sang cơ
số 3. Minh họa tình trạng stack được sử dụng
để lưu trữ các số dư trong quá trình chuyển đổi.
22
Ký pháp Ba Lan
Biểu thức dạng trung tố: dấu của các phép
toán hai ngôi luôn được đặt giữa 2 toán hạng
Ví dụ: A + B * C
A+B*C-D
(A+B) * C
(A + B )* (C – D)
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.
23
Ký pháp Ba Lan
Biểu thức dạng tiền tố:
Trung tố
Tiền tố
A+B
+AB
(A+B)*C
*+ A B C
A+B*C -D
- + A* B C D
(A + B )* (C – D)
*+AB–CD
Biểu thức dạng hậu tố:
Trung tố
Hậu tố
A+B
AB+
(A+B)*C
AB+C*
A+B*C-D
ABC*+D-
(A + B )* (C – D)
AB+CD-*
Không cần
thiết phải
dùng dấu
ngoặc
24
Tính giá trị biểu thức dạng hậu tố
Biểu diễn biểu thức bằng 1 stack dạng danh
sách liên kết.
Mỗi node trong DSLK biểu diễn cho 1 biến, hằng
hoặc toán tử
Duyệt biểu thức từ trái sang phải, gặp 1 toán tử
thì 2 toán hạng đứng sát ngay trước nó sẽ được
tính, tạo thành một toán hạng mới cho toán tử
gặp tiếp theo.
25