Tải bản đầy đủ (.pdf) (50 trang)

Thuật toán Stack queue kỹ thuật lập trình đại học KHTN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.45 MB, 50 trang )

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



×