You are on page 1of 24

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Mã môn học: IT003


Buổi 5

Số tiết lý thuyết: 45
Số tiết thực hành: 30
Số tiết tự học: 90

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
1
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Chương 3. Cấu trúc dữ liệu động (tt2)

3.10 Ngăn xếp

3.11 Hàng đợi

3.12 Ví dụ ngăn xếp, hàng đợi

- Bài toán Tháp Hà nội

- Các phép tính toán biểu thức số học

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
2
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.10. Stack (ngăn xếp)
a. Khái niệm:
Là 1 vật chứa các đối tượng làm việc theo cơ chế LIFO (Last In
First Out), ie, việc thêm 1 đối tượng vào Stack hoặc lấy 1 đối tượng ra
khỏi Stack được thực hiện theo cơ chế “vào sau ra trước”.
b. Ứng dụng:
▪ Trình biên dịch.
▪ Khử đệ qui đuôi.
▪ Lưu vết các quá trình quay lui, vét cạn.
▪ Lịch sử duyệt web.
▪ Đổi cơ số.
▪ Tính giá trị biểu thức toán học.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
3
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.10. Stack (ngăn xếp)
c. Các thao tác trên Stack
– Push(p): Thêm phần tử p vào Stack.

– Pop(): Lấy phần tử (p) ở đầu Stack ra khỏi Stack và trả về


giá trị của (p). Nếu Stack rỗng thì có thông báo xuất.

– isEmpty(): Kiểm tra Stack có rỗng hay không?

– Top(): Trả về giá trị của phần tử (p) nằm đầu Stack mà không
hủy nó khỏi Stack. Nếu Stack rỗng thì có thông báo xuất.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
4
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.10. Stack (ngăn xếp)
Thao tác Pop, Push chỉ diễn ra ở 1 đầu
S

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
5
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
i. Định nghĩa cấu trúc Stack
typedef struct tagSnode
{
Data Info;
struct tagSnode *pNext;
}SNode;
typedef struct tagstack
{
SNode *pHead;
} Stack;
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
6
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Stack

• Khởi tạo stack


void Init(Stack &s)
{
s.pHead=NULL;
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
7
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Stack (tt)

• Kiểm tra tính rỗng của Stack

int IsEmpty(Stack &s)


{
if (s.pHead == NULL) //Stack rỗng
return 1;
else return 0;
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
8
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Stack (tt)
• Thêm 1 phần tử vào Stack
void Push(Stack &s, SNode *p)
{ if (s.pHead == NULL)
{ s.pHead = p;
s.pTail = p;
}
else
{ p ->pNext = s.pHead;
s.pHead = p;
}
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
9
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Stack (tt)
• Lấy 1 phần tử từ Stack
int Pop(Stack &s, SNode *p)
{
if (IsEmpty(s) != 1)
{
p = s.pHead;
return p->Info;
s.pHead = s.pHead->pNext;
delete p;
}
return 0;
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
10
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.11 Queue (Hàng đợi)
a. Khái niệm:
là 1 vật chứa các đối tượng làm việc theo cơ chế FIFO
(First In First Out), ie, việc thêm 1 đối tượng vào Queue hay lấy 1
đối tượng ra khỏi Queue thực hiện theo cơ chế “vào trước ra
trước”.
b. Ứng dụng:
▪ Tổ chức lưu vết các quá trình tìm kiếm theo chiều rộng, và
quay lui vét cạn.
▪ Tổ chức quản lý và phân phối tiến trình trong các
hệ điều hành.
▪ Tổ chức bộ đệm bàn phím.
▪ …
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
11
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.11 Queue (Hàng đợi)

c. Các thao tác trên Queue


• EnQueue(p): Thêm p vào cuối hàng đợi.

• DeQueue(): Lấy phần tử ở đầu hàng đợi

• isEmpty(): Kiểm tra hàng đợi có rỗng hay không?

• Front(): Trả về giá trị của phần tử nằm đầu hàng đợi
mà không hủy nó.

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
12
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.11 Queue (Hàng đợi)

5 1 8 2

pHead pTail

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
13
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
i. Định nghĩa cấu trúc Queue
typedef struct tagQnode
{
Data Info;
tagQnode *pNext;
}QNode;
typedef struct tagqueue
{
QNode *pHeag, *pTail;
}Queue;
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
14
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Queue
• Khởi tạo hàng đợi rỗng:

void Init(Queue &q)


{
q. pHead = q.pTail = NULL;
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
15
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Queue

• Kiểm tra Queue có rỗng?

int IsEmpty(Queue &q)


{
if (q.pHead = = NULL) //Queue rỗng
return 1;
else return 0;
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
16
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Queue
• Thêm 1 phần tử vào Queue
void EnQueue(Queue &q, QNode *p)
{ if (q.pHead = = NULL)
{ q.pHead = p;
q.pTail = p;
}
else
{ q.pTail->pNext = p;
q.pTail = p;
}
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
17
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
ii. Các thao tác trên Queue
• Lấy 1 phần tử từ Queue
int DeQueue(Queue &q, QNode *p)
{ if (IsEmpty(q) != 1)
{ p = q.pHead;
return p->Info;
q.pHead = q.pHead->pNext;
if (q.pHead = = NULL) q.pTail = NULL;
delete p;
}
return 0;
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
18
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
3.12 Ví dụ ngăn xếp, hàng đợi

- Bài toán Tháp Hà nội

- Các phép tính toán biểu thức số học

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
19
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Bài toán Tháp Hà nội

• Luật:
– Di chuyển mỗi lần một đĩa
– Không được đặt đĩa lớn lên trên đĩa nhỏ

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
20
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Bài toán Tháp Hà nội

• Thuật toán dùng đệ quy:


– Chuyển (n-1) đĩa trên đỉnh của cột (start) A sang cột
(tempo) C.
– Chuyển 1 đĩa (cuối cùng) của cột A sang cột (finish) B
– Chuyển (n-1) đĩa từ cột C sang cột B

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
21
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Bài toán Tháp Hà nội
void move(int n, char A, char B, char C)
{ if (n > 0)
{ move(n − 1, A, C, B);
cout << “Di chuyen dia " << n << " tu " ;
cout<< A << " den " << B << "." << endl;
move(n − 1, C, B, A);
}
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
22
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Chuyển đổi cơ số

//Chuyen doi 1 so thap phan sang nhi phan


void ChangeBin(Stack &S, long n)
{ if (n<0) n=n*-1;
while (n!=0)
{ Push(S,n%2);
n=n/2;
}
}

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
23
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn
Chuyển đổi cơ số
int main()
{ cout<<“Dung Stack chuyen doi co so 10 sang co so 2";
Stack B;
int n;
Init(B);
cout<<"\n Nhap mot so thap phan: ";
cin>>n;
ChangeBin(B,n);
cout<<" So "<<n<<" duoc doi thanh so nhi phan: ";
Display(B);
return 0;
}
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN, KHU PHỐ 6, PHƯỜNG LINH TRUNG, QUẬN THỦ ĐỨC, TP. HỒ CHÍ MINH
24
[T] 08 3725 2002 101 | [F] 08 3725 2148 | [W] www.uit.edu.vn | [E] info@uit.edu.vn

You might also like