3
KHOA CÔNG NGHỆ THÔNG TIN
4
KHOA CÔNG NGHỆ THÔNG TIN
Cơ chế: Last In First Out LIFO
Stack
5
KHOA CÔNG NGHỆ THÔNG TIN
Mảng 1 chiều
Danh sách liên kết đơn
Cấp phát động!
Kích thước stack khi quá thiếu, lúc quá thừa
Push/Pop khá dễ dàng
Push / Pop hơi phức tạp
6
KHOA CÔNG NGHỆ THÔNG TIN
• Để khai báo một stack, ta cần một mảng 1 chiều S,
biến nguyên t cho biết chỉ số của đầu stack và hằng
số N cho biết kích thước tối đa của
struct Stack{
Data D [N]; count; int }
7
KHOA CÔNG NGHỆ THÔNG TIN
• Lệnh count = 0 sẽ tạo ra một stack S rỗng. • Giá trị của count sẽ cho biết số phần tử hiện
hành có trong stack
• Khi cài đặt bằng mảng 1 chiều, stack có kích thước tối đa nên cần xây dựng thêm một thao tác phụ cho stack:
• IsFull(): Kiểm tra xem stack có đầy chưa. • Khi stack đầy, việc gọi đến hàm push() sẽ
phát sinh ra lỗi.(overflow error)
8
KHOA CÔNG NGHỆ THÔNG TIN
class StackByArray
{
int[] iData; // lưu dữ liệu của stack int icount; // số phần tử stack đang lưu trữ public StackByArray(int size) {
iData = new int[size]; icount = 0;
}
}
9
KHOA CÔNG NGHỆ THÔNG TIN
Thêm một phần tử x vào stack S
void Push(Stack S,Data x)
if(S.count < N) // stack chưa đầy
{
S.D[count] = x;
{
S.count++;
}
else puts("Stack đầy");
}
10
KHOA CÔNG NGHỆ THÔNG TIN
public bool Push( int ivalue)
{
if (icount < iData.Length) // stack chưa đầy
{
iData[icount] = ivalue;// bỏ giá trị vào stack
icount++; // tăng số phần tử trong stack
return true; // thêm phần tử thành công
}
else
{
// stack đầy, overflow error
return false; // thêm phần tử thất bại
}
}
11
KHOA CÔNG NGHỆ THÔNG TIN
Trích thông tin và huỷ phần tử ở đỉnh stack S
Data Pop(Stack S)
{
Data
x;
if(S.count > 0) // stack khác rỗng
S.count--;
{
x = S.D[count];
return x;
}
else puts("Stack rỗng")
}
12
KHOA CÔNG NGHỆ THÔNG TIN
public int Pop()
{
if (icount>0) {
icount--; // giảm số lượng phần tử trong stack return iData[icount + 1]; // trả giá trị đỉnh stack về
} else
{
// stack không có phần tử, underflow error return int.MinValue; // trả min số nguyên về để biết mảng không có phần tử
}
13
} KHOA CÔNG NGHỆ THÔNG TIN
• Lệnh count = 0 sẽ tạo ra một stack S rỗng. • Giá trị của count sẽ cho biết số phần tử hiện
hành có trong stack
• Khi cài đặt bằng mảng 1 chiều, stack có kích thước tối đa nên cần xây dựng thêm một thao tác phụ cho stack:
• IsFull(): Kiểm tra xem stack có đầy chưa. • Khi stack đầy, việc gọi đến hàm push() sẽ
phát sinh ra lỗi.
14
KHOA CÔNG NGHỆ THÔNG TIN
Kiểm tra stack rỗng hay không char IsEmpty(Stack S) {
if(S.count == 0) // stack rỗng return 1; else return 0;
} Kiểm tra stack đầy hay không char IsFull(Stack S) {
if(S.count>= N) // stack đầy
return 1;
else
return 0;
}
15
KHOA CÔNG NGHỆ THÔNG TIN
• Xem thông tin của phần tử ở đỉnh stack S Data Top() {
Data x; if(count > 0) // stack khác rỗng x = S.D[S.count-1]; {
return x;
} else puts("Stack rỗng")
}
16
KHOA CÔNG NGHỆ THÔNG TIN
Nhận xét: • Các thao tác trên đều làm việc với chi phí O(1). • Việc cài đặt stack thông qua mảng một chiều đơn giản và khá hiệu
quả.
• Tuy nhiên, hạn chế lớn nhất của phương án cài đặt này là giới hạn về kích thước của stack N. Giá trị của N có thể quá nhỏ so với nhu cầu thực tế hoặc quá lớn sẽ làm lãng phí bộ nhớ.
17
KHOA CÔNG NGHỆ THÔNG TIN
• Dùng danh sách liên kết đơn
Head
Đầu ds
Class Node {
info; public Data public Node next;
} Class Stack # Định nghĩa Stack {
public Node Head;
Con trỏ trỏ đến đỉnh của Stack
}
18
KHOA CÔNG NGHỆ THÔNG TIN
• Các thao tác
Push
InitStack
Pop
IsEmpty
Head
Đầu ds
19
KHOA CÔNG NGHỆ THÔNG TIN
• Push: Thêm 1 phần tử x vào Stack
3
• Tạo node mới có dữ liệu x • Thêm vào đầu danh sách
s
2
1
s
2
3
1
p
New
Hàm thêm 1 phần tử có giá trị x vào Stack
Public void (Data x) {…}
20
KHOA CÔNG NGHỆ THÔNG TIN
• Pop: Lấy 1 phần tử ra khỏi ngăn xếp
• Lấy ra phần tử đầu danh sách • Trả về nội dung và giải phóng nút
s
p
3 3
2
1
3
s
2 1
X=
Hàm lấy một phần tử từ Stack
Public Data Pop() {…}
21
KHOA CÔNG NGHỆ THÔNG TIN
• Khử đệ quy
• Bài toán đổi số, tháp Hà Nội
• Áp dụng cho bài toán dùng cơ chế LIFO
• Chuyển biểu thức trung tố (Infix) sang biểu thức hậu tố
(Postfix)
• Tính giá trị biểu thức hậu tố
22
KHOA CÔNG NGHỆ THÔNG TIN
• Nhập 1 số nguyên (VD: nhập n=13) và cơ số (VD: CoSo=2) , xuất biểu diễn của số theo cơ số này.
13 2
11
6
2
00
3
2
Ngưng chia
11 1 2
1 1
0
1
0 1
1 0 1
1 1 0 1 23
23
KHOA CÔNG NGHỆ THÔNG TIN
1. Hiện thực Stack và các tác vụ của Stack bằng danh sách liên kết.
2. Viết chương trình đổi một số thập phân sang cơ số bất kỳ vận
dụng Stack.
3. Viết chương trình cài đặt bài toán chuyển biểu thức trung tố
sang hậu tố, sau đó tính giá trị biểu thức hậu tố.
24
KHOA CÔNG NGHỆ THÔNG TIN
25
KHOA CÔNG NGHỆ THÔNG TIN
• Hàng đợi là một vật chứa (container) các đối tượng làm việc theo cơ chế FIFO (First In First Out) việc thêm một đối tượng vào hàng đợi hoặc lấy một đối tượng ra khỏi hàng đợi được thực hiện theo cơ chế “Vào trước ra trước”.
• Các đối tượng có thể được thêm vào hàng đợi bất kỳ lúc nào nhưng chỉ có đối tượng thêm vào đầu tiên mới được phép lấy ra khỏi hàng đợi.
26
26
KHOA CÔNG NGHỆ THÔNG TIN
• Thêm vào cuối và lấy ra ở đầu • FIFO
27
27
KHOA CÔNG NGHỆ THÔNG TIN
• Thêm vào cuối và lấy ra ở đầu • FIFO
28
28
KHOA CÔNG NGHỆ THÔNG TIN
• Dùng DSLK đơn
pHead
pTail
NULL
An
A1
A2
29
KHOA CÔNG NGHỆ THÔNG TIN
• Queue dùng DSLK
Class Node {
• Con trỏ pHead trỏ đầu
danh sách
• Con trỏ pTail trỏ đến cuối
public Data public Node
info; next;
danh sách
• Thao tác Remove diễn ra
ở pHead
• Tháo tác Insert diễn ra ở
} Class Queue {
pTail
• Thao tác thêm xoá dễ
Node Node
pHead; pTail;
dàng ở hai đầu
}
30
KHOA CÔNG NGHỆ THÔNG TIN
• -Cấu trúc hàng đợi-queue, có các chức năng như sau
EnQueue: Thêm phần tử vào cuối(rear) của hàng đợi-queue.
DeQueue: Xóa phần tử khỏi đầu(front) của hàng đợi-queue.
Nếu hàng đợi-queue rỗng thì thông báo lỗi.
IsEmpty: Kiểm tra hàng đợi-queue rỗng.
Front: Lấy giá trị của phần tử ở đầu(front) của hàng đợi-
queue. Lấy giá trị không làm thay đổi hàng đợi-queue.
31
KHOA CÔNG NGHỆ THÔNG TIN
pHead
pTail
5
2
9
new
p
pHead
pTail
X
5
2
9
Public void EnQueue(Data x) {…}
32
KHOA CÔNG NGHỆ THÔNG TIN
• TH: Hàng đợi có 1 phần tử
pTail
pHead
5
p
33
KHOA CÔNG NGHỆ THÔNG TIN
• TH: Hàng đợi có nhiều phần tử
pHead
pTail
5
2
9
5
2
9
pHead pTail
p
34
KHOA CÔNG NGHỆ THÔNG TIN
• Hàng đợi là cấu trúc dữ liệu được dùng khá phổ biến trong thiết kế giải thuật. Bất kỳ khi nào cần quản lý dữ liệu, quá trình,… theo kiểu vào trước ra trước.
• 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…
35
KHOA CÔNG NGHỆ THÔNG TIN
1. Hiện thực hàng đợi và các tác vụ của hàng đợi
bằng danh sách liên kết.
2. Viết chương trình quản lý kho hàng dùng hàng đợi được hiện thực bằng danh sách liên kết.
36
KHOA CÔNG NGHỆ THÔNG TIN
1. Hiện thực cấu trúc StackByArray lưu số
nguyên, có các thao tác: • Push(int value) • Pop() • IsEmpty() • Top()
2. Hiện thực QueueByLinkedList lưu số nguyên,
có các thao tác: • Void Enqueue(int value) • Int Dequeue() • Int Count() • Int Top()
37