CHƯƠNG 5
KIỂU NGĂN XẾP, HÀNG ĐỢI, ĐỆ QUY
GV Th.S. Thiều Quang Trung
Trường Cao đẳng Kinh tế Đối ngoại
Nội dung
1
2
3
4
5
6
• Khái niệm ngăn xếp
• Phương pháp xây dựng stack
• Các thao tác cơ bản trên stack
• Kiểu queue - hàng đợi
• Các thao tác cơ bản trên queue
• Đệ qui và các bài toán đệ qui
GV. Thiều Quang Trung
2
Ngăn xếp - Định nghĩa
• Stack là 1 cấu trúc:
– Gồm nhiều phần tử
– Hoạt động theo cơ chế “Vào sau – Ra trước”
(LIFO – Last In, First Out)
Đỉnh
ngăn
xếp
GV. Thiều Quang Trung
3
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
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
GV. Thiều Quang Trung
Pop
4
PUSH
Thao tác thêm - Push vào Stack
Top
GV. Thiều Quang Trung
5
Thao tác lấy - Pop khỏi stack
Top
POP
GV. Thiều Quang Trung
6
Ví dụ thêm và xóa phần tử trong stack
Cần nhập 4 số vào
Nhập 1
Ban đầu
1
Lấy ra => 3
Lấy ra => 7
3
7
7
5
1
5
1
Nhập 5
5
1
Lấy ra => 5
5
1
GV. Thiều Quang Trung
Nhập 7
Nhập 3
7
3
7
5
1
5
1
Lấy ra => 1
Stack đã rỗng
Ngừng
1
7
Cách xây dựng Stack
Mảng 1 chiều
Danh sách liên kết
▪ Viết chương trình dễ ▪ Phức tạp khi triển khai
dàng, nhanh chóng
chương trình
▪ Bị hạn chế do số lượng ▪ Không bị cố định về số
phần tử cố định
phần tử, phụ thuộc vào
bộ nhớ
▪ Tốn chi phí tái cấp phát
và sao chép vùng nhớ
nếu sử dụng mảng
động
GV. Thiều Quang Trung
8
Stack – Sử dụng mảng
Top
6
3
9
Stack
9
3
6
0
1
2
3
4
5
GV. Thiều Quang Trung
6
7
8
9
9
Stack 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;
GV. Thiều Quang Trung
10
Stack 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;
}
GV. Thiều Quang Trung
11
Stack số nguyên – Sử dụng mảng
bool IsEmpty(const STACK &s)
{
if (s.StkTop==-1)
return true;
return false;
}
GV. Thiều Quang Trung
12
Stack số nguyên – Sử dụng mảng
bool IsFull(const STACK &s)
{
if (s.StkTop==s.StkMax-1)
return true;
return false;
}
GV. Thiều Quang Trung
13
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;
}
GV. Thiều Quang Trung
14
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;
}
GV. Thiều Quang Trung
15
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)
GV. Thiều Quang Trung
16
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ự
• Kinh tế Đối ngoại ➔ iạogn iốĐ ết hniK
GV. Thiều Quang Trung
17
Stack – Sử dụng DSLK
StkCnt
StkTop
N
7
7
9
Data
Link
9
Data
Link
4
4
Data
GV. Thiều Quang Trung
Link
18
Stack – Sử dụng DSLK
• Cấu tạo đầu stack
StkCnt
StkTop
N
• Cấu tạo một phần tử
Data
stack
StkCnt <integer>
StkTop <node pointer>
end stack
node
Data
Link
end node
<datatype>
<node pointer>
Link
GV. Thiều Quang Trung
19
Stack số nguyên – Sử dụng DSLK
typedef struct tagSTACK_NODE
{
int Data;
tagSTACK_NODE *pNext;
} STACK_NODE;
typedef struct STACK
{
int StkCount;
STACK_NODE *StkTop;
};
GV. Thiều Quang Trung
20
Stack – Sử dụng DSLK
• VD: Thực hiện một số thao tác trên stack
STACK s;
InitStack(s);
StkCnt StkTop
N
Push(s, 7);
Push(s, 4);
47
Data
Pop(s, x); // x = ?
GV. Thiều Quang Trung
Link
21
Stack số nguyên – Sử dụng DSLK
void InitStack(STACK &s)
{
s.StkTop = NULL;
s.StkCount = 0;
}
GV. Thiều Quang Trung
22
Stack số nguyên – Sử dụng DSLK
bool IsEmpty(const STACK &s)
{
if (s.StkTop == NULL)
return true;
return false;
}
GV. Thiều Quang Trung
23
Stack số nguyên – Sử dụng DSLK
bool IsFull (const STACK s)
{
STACK_NODE* temp = new STACK_NODE;
if (temp == NULL)
return true;
delete temp;
return false;
}
GV. Thiều Quang Trung
24
Stack số nguyên – Sử dụng DSLK
bool Push(STACK &s, int newitem)
{
StkCnt StkTop
if (IsFull(s))
N
return false;
STACK_NODE *pNew = new STACK_NODE;
pNew->Data = newitem;
pNew->pNext = s.StkTop;
s.StkTop = pNew;
s.StkCount++;
return true;
}
GV. Thiều Quang Trung
47
Data
Link
25