Chương 3. Tổ chức ngăn xếp
(Stack) & Hàng đợi (Queue) trên
mảng một chiều
Trần Minh Thái
Email:
Website: www.minhthai.edu.vn
1
Nội dung
Trình bày khái niệm Ngăn xếp (Stack) và Hàng đợi
(Queue)
Các thao tác trên Ngăn xếp và Hàng đợi
Minh họa các ứng dụng
2
Ngăn xếp
Ngăn xếp là gì?
Cách khai báo cấu trúc ngăn xếp dùng mảng một
chiều?
Các ứng dụng
Cài đặt
3
Ví dụ về Ngăn xếp
Thành phần được lấy ra đầu tiên?
4
Khái niệm Stack
Gồm nhiều phần tử lưu trữ theo thứ tự
Hoạt động theo cơ chế “Vào sau – Ra trước” (LIFO
– Last In, First Out)
Đỉnh
ngăn
xếp
5
Thao tác cơ bản trên Stack
InitStack: khởi tạo Stack rỗng
IsEmpty: kiểm tra Stack rỗng?
Push
Pop
IsFull: kiểm tra Stack đầy?
Push: thêm 1 phần tử vào Stack
Pop: lấy ra 1 phần tử khỏi Stack
6
PUSH
Thao tác Push vào Stack
Top
7
Thao tác Pop khỏi stack
Top
POP
8
Stack – Sử dụng mảng
Top
C
B
A
Stack
B
C
0
1
2
Top
A
3
4
5
6
7
8
9
9
Ngăn xếp – Sử dụng mảng
A
B
Top A
C
Top B
A
D
Top C
B
A
E
Top D
C
B
A
Top
D
C
B
A
Top
10
Ví dụ, Ngăn xếp chứa số nguyên – Sử
dụng mảng
struct ttStack
{
int* StkArray; // mảng chứa các phần tử
int StkMax; // số phần tử tối đa
int StkTop; // vị trí đỉnh Stack
};
typedef struct ttStack STACK;
11
Ngăn xếp số nguyên – Sử dụng mảng
bool InitStack(STACK& s, int MaxItems)
{
s.StkArray = new int[MaxItems];
if (s.StkArray == NULL)
return false;
s.StkMax = MaxItems;
s.StkTop = -1;
return true;
}
12
Ngăn xếp số nguyên – Sử dụng mảng
bool IsEmpty(const STACK &s)
{
if (s.StkTop==-1)
return true;
return false;
}
13
Stack số nguyên – Sử dụng mảng
bool IsFull(const STACK &s)
{
if (s.StkTop==s.StkMax-1)
return true;
return false;
}
14
Stack số nguyên – Sử dụng mảng
bool Push (STACK &s, int newitem)
{
if (IsFull(s))
return false;
s.StkTop++;
s.StkArray[s.StkTop] = newitem;
return true;
}
15
Stack số nguyên – Sử dụng mảng
bool Pop(STACK &s, int &outitem)
{
if (IsEmpty(s))
return false;
outitem = s.StkArray[s.StkTop];
s.StkTop--;
return true;
}
16
Bài tập
Viết hàm nhập và xuất Stack số nguyên
Khai báo cấu trúc và viết hàm tạo Stack từ chuỗi ký
tự str (mỗi phần tử Stack là ký tự)
Khai báo cấu trúc và viết hàm tạo Stack từ chuỗi ký
tự str (mỗi phần tử Stack là một từ - từ cách nhau
bởi khoảng trắng)
17
Stack – Ví dụ ứng dụng
Kiểm tra sự tương ứng của các cặp ngoặc đơn trong
một biểu thức
( ( A + B ) / C ?
?
( A + B ) / C)
Đảo ngược một chuỗi ký tự
Cá Ăn Kiến
nếiK nĂ áC
18
Stack – Ứng dụng
Stack có nhiều ứng dụng:
Lưu vết trong thuật tốn “back-tracking” (theo dõi
dấu vết)
Tính giá trị biểu thức toán học (thuật toán Balan
ngược)
Khử đệ quy
…
19
Stack – Quick Sort
Để khử đệ quy cho Quick Sort, ta sử dụng một stack để
lưu lại các partition (phân hoạch) cần tiến hành sắp
xếp.
Ý tưởng:
Push phân hoạch đầu tiên (0, n-1) vào stack
Trong khi stack chưa rỗng
Pop một phân hoạch từ stack
Chọn phần tử trục trên phân hoạch này
Điều chỉnh phân hoạch tương ứng với trục
Push 2 phân hoạch bên trái và phải trục vào stack
20
Stack – Quick Sort
Push phân hoạch đầu tiên (0, n-1) vào stack
Trong khi stack chưa rỗng
Pop một phân hoạch từ stack
Chọn phần tử trục trên phân hoạch này
Điều chỉnh phân hoạch tương ứng với trục
Push 2 phân hoạch bên trái và phải trục vào stack
Stack rỗng
Stop
(3,4)
(0,4)
(0,1)
t
1
35
4
57
753
0
1
2
3
4
i
j
21
Queue
Phòng vé
22
Queue – Định nghĩa
Hàng đợi là một cấu trúc:
Gồm nhiều phần tử có thứ tự
Hoạt động theo cơ chế “Vào trước, ra trước”
(FIFO - First In First Out)
23
Queue – Định nghĩa
Các thao tác cơ bản trên hàng đợi:
InitQueue: khởi tạo hàng đợi rỗng
IsEmpty: kiểm tra hàng đợi rỗng?
IsFull: kiểm tra hàng đợi đầy?
EnQueue: thêm 1 phần tử vào cuối hàng
đợi, có thể làm hàng đợi đầy
DeQueue: lấy ra 1 phần tử từ đầu Queue,
có thể làm Queue rỗng
24
Queue
Minh họa thao tác EnQueue
Minh họa thao tác DeQueue
25