Professional Documents
Culture Documents
B09 Stack&Queue
B09 Stack&Queue
• Giới thiệu
• Cài đặt
Stack
• Các thao tác
• Ứng dụng
• Giới thiệu
• Cài đặt
Queue
• Các thao tác
• Ứng dụng
Giới
Cài đặt
thiệu
pTop 700
Push/Pop
Push / Pop hơi khá dễ
phức tạp dàng
pTop
Đầu
danh sách
pTop pTop
Push
new
2 9 8 2 9
node
pTop pTop
Pop
5 2 9 2 9
15
5.1.3 Các thao tác
1. int Pop(NodePtr &pTop)
2. {
3. NodePtr p; //trỏ nút loại bỏ
4. int value; //lưu giá trị nút
5. if (pTop == NULL) //ngăn xếp rỗng
6. { cout<<“Stack is empty!”;
7. return -1;
8. }
9. p = pTop;
10. pTop = pTop->next;
11. value = p->info;
12. delete p;
13. return value;
14.}
16
5.1.3 Các thao tác
GetSize - đếm số nút của stack
1. int GetSize(NodePtr &pTop)
2. { int d = 0;
3. NodePtr p; //con tro duyet
4. p = pTop; //duyet tu dau
5. while (p!= NULL)
6. { d++;
7. p = p -> next;
8. }
9. return d;
10.}
17
5.1.3 Các thao tác
pTop
Top
5 2 9
pTop
5 2 9
18
5.1.3 Các thao tác
19
5.1.4 Ứng dụng stack
Ứng dụng stack
- Khử đệ quy:
Tháp Hanoi, QuickSort…
20
Chuyển đổi hệ cơ số
Chuyển đổi một số nguyên n từ hệ cơ số 10 sang hệ cơ
số b, dùng Stack
22 2
Quy tắc
Muốn đổi số nguyên n từ hệ cơ 0 11 2
số 10 sang hệ cơ số b, thực hiện
như sau: 1 5 2
B1: Lấy n chia cho b.
B2: Nếu kết quả còn khác 0, 1 2 2
chia tiếp cho b, nếu kết quả bằng
0 chuyển sang bước 3. 0 2
B3: Viết ngược thứ tự các phần
1
dư nhận được trong quá trình 1
thực hiện phép chia ta thu được
0
biểu diễn của n trong hệ cơ số b. 22(10) 10110 (2)
21
Postfix
Chuyển biểu thức trung tố sang hậu tố
Trung tố Hậu tố
(6 / 2 + 3) * (7 - 4) 62/3+74-*
23
Cấu trúc dữ liệu - Khoa CNTT 24
Cấu trúc dữ liệu - Khoa CNTT 25
Cấu trúc dữ liệu - Khoa CNTT 26
Postfix
Duyệt qua từng phần tử trong infix C
- Nếu C là “(“ thì push stack.
- Nếu C là “)” thì lấy tất cả phần tử trong stack cho đến khi
gặp “(“. Xuất ra biểu thức hậu tố
27
Postfix
(2 * 3 + 8 / 8) * (5 – 1)
Jan Lukasiewicz
30
Postfix
Ý tưởng
Khởi tạo stack = {Ø}
Đọc biểu thức hậu tố lần lượt từ trái, kiểm tra
- Nếu toán hạng: push stack
- Nếu toán tử: lấy hai toán hạng ở đỉnh stack ra, thực hiện
phép toán, kết quả push vào stack
Sau khi đọc xong, trong stack còn duy nhất một
phần tử kết quả!
31
Cấu trúc dữ liệu - Khoa CNTT 32
Cấu trúc dữ liệu - Khoa CNTT 33
35
5.2 Queue
Giới
thiệu
Ứng Cài
Queue
dụng đặt
Các
thao
tác
36
5.2.1 Giới thiệu
Queue là một cấu trúc dữ liệu mà việc bổ sung và loại
bỏ thực hiện ở hai đầu khác nhau
Bổ sung vào cuối và loại bỏ ở đầu
pFront pRear
5 2 9
37
5.2.1 Giới thiệu
FIFO: First In First Out
Thêm vào cuối và lấy ra ở đầu
38
5.2.1 Giới thiệu
Queue dùng DSLK
- Con trỏ pFront trỏ đầu danh sách
- Con trỏ pRear trỏ đến cuối danh sách
- Thao tác Remove diễn ra ở pFront
- Tháo tác Insert diễn ra ở pRear
- Thao tác thêm xoá dễ dàng
pFront pRear
5 2 9
39
5.2.2 Cài đặt
Khai báo cho Queue dạng DSLK
40
5.2.3 Các thao tác
Các thao tác trên Queue
- Init : Khởi tạo hàng đợi
42
5.2.3 Các thao tác
Init – Khởi tạo Queue
pFront pRear
new
5 2 9 x
node
pFront pRear
q.pRear = node
5 2 9 x
q.pRear -> next =node
44
5.2.3 Các thao tác
1. void Insert(Queue &q, int x)
2. { NodePtr node;
3. node = new NODE;
4. node -> info = x;
5. node -> next = NULL;
6. if (q.pRear == NULL)
7. { q.pRear = node;
8. q.pFront = node;
9. }
10. else
11. { q.pRear->next = node;
12. q.pRear = node;
13. }
14.}
45
5.2.3 Các thao tác
Remove - Loại bỏ một nút khỏi hàng đợi
pFront pRear
5 2 9
pFront pRear
2 9
46
5.2.3 Các thao tác
1. int Remove(Queue &q)
2. { NodePtr p;
3. int value;
4. if (q.pFront == NULL) //hang doi rong
5. return -1;
6. else
7. if (q.pFront == q.pRear) //chi co 1 nut
8. { p = q.pFront;
9. q.pFront = q.pRear = NULL;
10. }
11. else //co nhieu nut
12. { p =q.pFront;
13. q.pFront = p->next; }
14. value = p->info;
15. delete p;
16. return value;
17.}
47
5.2.3 Các thao tác
QueueSize - Đếm số nút của hàng đợi
1. int QueueSize(Queue &q)
2. { int d = 0; //bien dem d
3. NodePtr p; //con tro de duyet
4. p = q.pFront; //duyet tu dau
5. while (p != NULL)
6. { d++;
7. p = p -> next;
8. }
9. return d;
10.}
48
5.3.2 Các thao tác
QueueFront – Lấy ra giá trị của nút trỏ bởi pFront
1. int QueueFront(Queue &q)
2. {
3. if (q.pFront == NULL)
4. return -1;
5. else
6. return q.pFront->info;
7. }
49
5.3.2 Các thao tác
QueueRear – Lấy ra giá trị của nút trỏ bởi pRear
1. int QueueRear(Queue &q)
2. {
3. if (q.pRear == NULL)
4. return -1;
5. else
6. return q.pRear->info;
7. }
50
5.2.3 Các thao tác
ClearQueue – Xóa hàng đợi
1. void ClearQueue(Queue &q)
2. { NodePtr p;
3. while (q.pFront != NULL)
4. { p = q.pFront;
5. q.pFront = p -> next;
6. delete p;
7. }
8. }
51
5.2.4 Ứng dụng
Ứng dụng Queue
- Trong bài toán hàng đợi “Vào trước ra trước” FIFO:
Hệ thống print server
Cơ chế thông điệp, bộ đệm, hàng đợi xử lý sự kiện…
Các ứng dụng đặt vé tàu lửa, máy bay…
Các hệ thống rút tiền…
52
Câu hỏi củng cố bài
1. Thao tác nào dưới đây thực hiện trên ngăn xếp
(stack):
A. Thêm và loại bỏ phần tử luôn thực hiện ở đầu
danh sách
C. Cơ chế tuần tự