cấu trúc dữ liệu & giải thuật
DESCRIPTION
Cấu Trúc Dữ Liệu & Giải Thuật. Stack and Queue. GV : Phạm Ngọc Nam Khoa : CNTT Email: [email protected]. Stack (Ngăn xếp). Queue (Hàng Đợi). Giới thiệu. Một số hình ảnh thông dụng. Một chồng Sách Vở ở trên bàn Một chồng Đĩa Nhận xét gì từ các ví dụ trên ?. - PowerPoint PPT PresentationTRANSCRIPT
![Page 2: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/2.jpg)
2
Stack (Ngăn xếp)
![Page 3: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/3.jpg)
3
Queue (Hàng Đợi)
![Page 4: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/4.jpg)
4
Giới thiệu
Một số hình ảnh thông dụng
![Page 5: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/5.jpg)
5
Ngăn xếp là cấu trúc chứa các đối tượng làm việc theo cơ chế “ vào sau ra trước” (Last in First out). đối tượng có thể được thêm vào bất kỳ lúc nào, nhưng chỉ có đối tượng vào sau cùng mới được phép lây ra khỏi ngăn xếp.
Giới thiệu
Định nghĩa:
![Page 6: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/6.jpg)
6
Lưu trữ Ngăn Xếp. khởi tạo Stack rỗng Kiểm tra Ngăn Xếp rỗng. Thêm một phần tử vào Ngăn Xếp. Lấy một phần tử ra khỏi Ngăn Xếp. Lấy thông tin của phần tử đầu Ngăn Xếp.
Các thao tác trên ngăn xếp
![Page 7: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/7.jpg)
7
Thêm vào đầu danh sách(AddHead): phần tử mới thêm nằm ở đầu danh sách Truy xuất danh sách: Truy xuất phần tử nằm ở đầu trước.=> Thích hợp với tính chất của Ngăn Xếp.
Lưu trữ Stack bằng DSLK
![Page 8: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/8.jpg)
8
Lưu trữ Stack bằng DSLK
![Page 9: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/9.jpg)
9
Cài đặt khai báo cấu trúc 1 phần tử trong Stack struct NodeStack{
dataType data;NodeStack *pNext;
}; khai báo cấu trúc Stack
struct Stack{
int count;NodeStack *pHead;
};
Lưu trữ Stack bằng DSLK
![Page 10: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/10.jpg)
10
Cài đặt: void InitStack(Stack &s){
s.count = 0;s.pHead==NULL)
}
Khởi tạo Stack
![Page 11: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/11.jpg)
11
Ngăn xếp rỗng khi không chứa phần tử nào. Cài đặt: bool IsEmpty(const Stack s){
if(s.pHead==NULL)return true;
return false;}
Kiểm tra Stack Rỗng
![Page 12: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/12.jpg)
12
Ngăn xếp đầy khi không thể cấp phát thêm vùng nhớ. Khi thêm 1 phần tử vào Ngăn Xếp, nếu không cấp phát được vùng nhớ => Thông báo ngăn xếp đầy.
Kiểm tra Stack đầy
bool IsFull(const Stack &s){
NodeStack *pNew=new NodeStack;if(pNew == NULL)// nếu ko tạo đc stack đầy
return true;return false;// stack ko đầy
}
![Page 13: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/13.jpg)
13
Giải Thuật: Tương tự thao tác thêm đầu(AddHead). Nếu không thêm được(do không cấp phát được vùng nhớ) trả về giá trị cho biết ngăn xếp đầy.
Cài đặt:
Thêm một phần tử
![Page 14: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/14.jpg)
14
Cài đặt: int Push(Stack &s, int x)
{ NodeStack *pNew = new NodeStack;if(pNew == NULL)
return 0;// ko cấp phát được vùng nhớ, stack đầy
pNew -> data = x;pNew -> pNext = NULL;if(s.pHead == NULL){
s.pHead = pNew;return 1;
}else{
pNew -> pNext = s.pHead;s.pHead = pNew;return 1;
}
}
Thêm một phần tử
![Page 15: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/15.jpg)
15
Cài đặt cách khác int Push(Stack &s, int x)
{ if(IsFull(s))
return 0;// stack đầy ko thêm đcNodeStack *pNew = new NodeStack;pNew -> data = x;pNew -> pNext = s.pHead;s.pHead = pNew;s.count ++;return 1; // thêm thành công
}
Thêm một phần tử
![Page 16: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/16.jpg)
16
Lấy đối tượng ở đầu Ngăn Xếp ra khỏi Ngăn Xếp và trả về giá trị của đối tượng đó. Nếu Stack rỗng báo lỗi. Thuật toán:
kiểm tra Ngăn Xếp rỗng hay không Nếu không:
Ghi nhận giá trị của phần tử ở đầu Ngăn Xếp. Xóa phần tử đầu ra khỏi Ngăn Xếp. Trả về giá trị đã ghi nhận.
Lấy một phần tử ra khỏi ngăn xếp
![Page 17: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/17.jpg)
17
Cài đặt DataType * Pop(Stack &s){
// Kiểm tra Ngăn Xếp rỗngif(……………….)
return 0;// Ghi nhận giá trị đầu Ngăn Xếpdatatype x= l.pHead->data;// Xóa đầu Ngăn Xếp/ / Trả về giá trị đã ghi nhânreturn …;
}
Lấy một phần tử ra khỏi ngăn xếp
![Page 18: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/18.jpg)
18
Cài đặt int Pop(Stack &s){
if(s.pHead = = NULL)return 0; // stack rỗng không lấy ra được
NodeStack * pNew = s.pHead;s.pHead = pNew ->pNext;delete pNew ;s.count --;return 1; // xóa thành công
}
Lấy một phần tử ra khỏi ngăn xếp
![Page 19: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/19.jpg)
19
Cài đặt int Pop(Stack &s, int &outdata){
if(IsEmpty(s))return 0; // stack rỗng không lấy ra được
NodeStack * pNew = s.pHead;outdata = pNew -> data;s.pHead = pNew ->pNext;delete pNew ;s.count --;return 1; // lấy ra thành công
}
Lấy một phần tử ra khỏi ngăn xếp
![Page 20: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/20.jpg)
20
Lưu vết trong các giải thuật “back-tracking” Bài toán “N quân hậu”
Các ứng dựng của Stack
![Page 21: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/21.jpg)
21
Queue (Hàng Đợi)
21
![Page 22: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/22.jpg)
22
Queue là cấu trúc chứa các đối tượng làm việc theo qui tắc “ Vào sau ra trước(FIFO)”. 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 lấy ra khỏi hàng đợi.
Việc thêm vào diễn ra ở cuối, việc lấy ra diễn ra ở đầu.
Giới thiệu
![Page 23: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/23.jpg)
23
Lưu trữ Queue. kiểm tra Queue rỗngThêm một phần tử vào cuối Queue. Lấy một phần tử ở đầu ra khỏi Queue. Lấy thông tin của đối tượng ỏ đầu Queue.
Các thao tác trên Queue
![Page 24: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/24.jpg)
24
Khai báo hàng đợi như một DSLK với phần tử đầu (pHead) và đuôi (pTail). Phần tử đầu: nơi lấy dữ liệu hàng đợi ra.Phần tử đuôi: nơi thêm phần tử vào
Lưu trữ Queue bằng DSLK
![Page 25: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/25.jpg)
25
Hàng đợi rỗng khi không có phần tử nào (DS rỗng)
Kiểm tra Queue rỗng
Cài đặt bool IsEmpty(NodeQueue *q){
if(q->pHead = = NULL)return true;
return false;}
![Page 26: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/26.jpg)
26
Hàng đợi đầy khi không thể cấp phát thêm vùng nhớ.
Kiểm tra Queue đầy
Khi thêm 1 phần tử vào hàng đợi, nếu không cấp phát được vùng nhớ -> Thông báo hàng đợi đầy Cài đặt bool IsFull(…)
{ if(…)…
}
![Page 27: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/27.jpg)
27
Giải thuật: Tương tự thao tác thêm cuối.
Thêm phần tử vào cuối Queue
Nếu không thêm được (do không cấp phát được vùng nhớ) trả về giá trị cho biết hàng đợi đầy Cài đặt: int EnQueue (NODE *&pHead, NODE *&pTail, Data x) {
//tạo 1 nút mớiif(<không tạo được>)
return 0;//thêm nút mới vào đuôireturn 1;
}
![Page 28: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/28.jpg)
28
Giải thuật: Ghi nhận giá trị của phần tử ở đầu hàng đợi. Xóa phần tử đầu ra khỏi hàng đợi. Trả về giá trị đã ghi nhận.
Lấy phần tử đầu ra khỏi Queue
Cài đặt: Data DeQueue(NODE*& pHead, NODE*& pTail) {
//kiểm tra Queue rỗng?if(…)
return …;////ghi nhận giá trị đầu QueueData x = pHead -> data;//xóa đầu Queue…//trả về giá trị đã ghi nhậnreturn _______;
}
![Page 29: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/29.jpg)
29
Giải thuật: Chỉ lấy thông tin của đối tượng đầu hàng đợi mà không
hủy đối tượng khỏi hàng đợi.
Lấy phần tử đầu Queue
Cài đặt: Kiểm tra hàng đợi rỗng? Trả về giá trị của phần tử đầu hàng đợi.
Data DeQueue(NODE*& pHead) {
….}
![Page 30: Cấu Trúc Dữ Liệu & Giải Thuật](https://reader034.vdocuments.pub/reader034/viewer/2022051117/568158ce550346895dc61a0b/html5/thumbnails/30.jpg)
30
Sử dụng giải 1 số bài toán lý thuyết đồ thị.…
Các ứng dựng của Queue