Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 1 Trình bày khái niệm tổng quát về kiểu dữ liệu Cài đặt các kiểu dữ liệu theo hướng cấu trúc Cà
Trang 1Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 1
Trình bày khái niệm tổng
quát về kiểu dữ liệu
Cài đặt các kiểu dữ liệu theo hướng cấu trúc
Cài đặt các kiểu dữ liệu theo hướng đối tượng bằng C++
Kiểu dữ liệu trừu tượng – (ADT)
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 2
Nội dung trình bày
Kiểu dữ liệu trừu tượng (ADT)
So sánh một số cài đặt kiểu dữ liệu theo
hướng cấu trúc và cài đặt kiểu dữ liệu theo
hướng đối tượng bằng C++
Áp dụng Template và việc xây dựng các
kiểu dữ liệu tổng quát
Trang 2Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 3
Kiểu dữ liệu trừu tượng (ADT)
ADT - Abstract Data Type
Kiểu dữ liệu trừu tượng: T = <V, O>
V (Values - miền giá trị): tập hợp các giá trị
mà kiểu T có thể nhận
O (Operators – các thao tác): tập hợp các thao
tác cơ bản được định nghĩa trên V
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 4
Kiểu dữ liệu trừu tượng (ADT)
Ví dụ:
T = int:
V = {-32768 +32767}
O = {+, -, *, div, mod, >, >=, <, <=, ==, !=,…}
Có nhiều cách để xây dựng các kiểu dữ
liệu, và không có 1 qui định cụ thể về việc
cần phải xây dựng các thao tác như thế nào
Trang 3Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 5
Kiểu dữ liệu trừu tượng (ADT)
Cài đặt kiểu dữ liệu theo hướng cấu trúc (struct):
Áp dụng khi chưa có công cụ lập trình hướng đối
tượng
Xây dựng các thao tác dưới dạng những thủ tục/hàm
Các thao tác và dữ liệu (V, O) tách rời nhau
Dữ liệu không được “bảo vệ”, vì ta có thể truy xuất
đến ở bất cứ đâu trong phạm vi mà dữ liệu đã được
định nghĩa
…
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 6
Kiểu dữ liệu trừu tượng (ADT)
Cài đặt kiểu dữ liệu theo hướng đối tượng:
Dữ liệu và thao tác được tích hợp lại
Dữ liệu được “ẩn” (hiding) và bảo vệ, tránh
những truy xuất trực tiếp
Chương trình chỉ truy xuất đến dữ liệu thông
qua các thao tác đã được định nghĩa
Trang 4Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 7
Kiểu dữ liệu trừu tượng (ADT)
Ưu điểm của cài đặt kiểu dữ liệu bằng hướng đối tượng
Chương
trình
Dữ liệu và các thao tác
Yêu cầu truy xuất dữ liệu
Kết quả thực hiện
Bảo vệ
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 8
Kiểu dữ liệu trừu tượng (ADT)
Truy xuất “tự do” đến dữ liệu
Program Data
Add
Remove
Find
Display
Program
Yêu cầu
Kết quả
Dữ liệu được “bảo vệ”
Data
Add
Remove
Find
Display
Trang 5Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 9
Kiểu dữ liệu trừu tượng (ADT)
Cài đặt kiểu dữ liệu theo hướng đối
tượng…: (tt)
Có thể “che dấu” những thao tác xử lý cục
bộ, giúp đơn giản hoá việc sử dụng bằng cách
chỉ cung cấp cho người dùng những thao tác
thực sự cần thiết
Nâng cao tính “module hoá” của chương trình
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 10
Kiểu dữ liệu trừu tượng (ADT)
Che dấu các thao tác xử lý cục bộ
Trang 6Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 11
So sánh một số cài đặt kiểu dữ liệu…
Danh sách liên kết (Linked-list)
Ngăn xếp (Stack)
Cây nhị phân tìm kiếm (BST)
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 12
So sánh một số cài đặt kiểu dữ liệu…
Danh sách liên kết (Linked-list)
Trang 7Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 13
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng cấu trúc
typedef struct tagNODE {
INFO data;
tagNODE *pNext;
} NODE;
// Quản lý danh sách bằng con trỏ đầu và cuối
typedef struct LINKED_LIST {
NODE *pHead;
unsigned int Count; // số nút trong danh sách
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 14
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng cấu trúc … (tt)
// Xây dựng các thao tác cơ bản
void CreateEmptyList(LINKED_LIST &list);
int IsEmptyList(const LINKED_LIST &list);
int CountNode(const LINKED_LIST &list);
int InsertNode(LINKED_LIST &list, int index,
INFO newdata);
int DeleteNode(LINKED_LIST &list, NODE *pPrev,
NODE *pCurr);
void TraverseList(const LINKED_LIST &list);
NODE *FindNode(const LINKED_LIST &list, <KeyType> key);
Trang 8Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 15
So sánh một số cài đặt kiểu dữ liệu…
Cài đặt danh sách liên kết theo hướng đối tượng
Chương trình
sử dụng List Dữ liệu của List
Gọi thao tác Kết quả
Interface
Create
Insert
Traverse
Delete
Find
Client
Server
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 16
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng đối tượng
class LINKED_LIST {
private:
struct NODE // 1 nút trong danh sách
{
INFO data;
NODE *pNext; // trỏ đến nút kế tiếp
};
unsigned int Count; // Số nút trong danh sách
NODE *pHead;
NODE *pTail;
…
Trang 9Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 17
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng đối tượng…(tt)
public:
// constructors và destructor:
LINKED_LIST();
LINKED_LIST(const LINKED_LIST &aList);
~List();
// các thao tác
int IsEmpty() const;
int Count() const;
int Insert(int index, INFO newdata);
int Delete(NODE *pPrev, NODE *pCurr);
void Traverse();
NODE *Find(<KeyType> key);
} // end class
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 18
So sánh một số cài đặt kiểu dữ liệu…
Ngăn xếp (Stack)
Trang 10Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 19
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng cấu trúc (dùng mảng)
typedef struct STACK {
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
};
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 20
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng cấu trúc (dùng danh sách liên kết)
// Khai báo cấu trúc 1 phần tử trong Stack
typedef struct tagSTACK_NODE {
} STACK_NODE;
// Khai báo cấu trúc Stack
typedef struct STACK {
STACK_NODE *StkTop;
}
Trang 11Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 21
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng cấu trúc
// - Định nghĩa các thao tác
int InitStack(STACK &s, int MaxItems);
int IsEmpty(const STACK &s);
int IsFull(const STACK &s);
int Push(STACK &s, int newitem);
int Pop(STACK &s, int &outitem);
int StackTop(const STACK &s, int &outitem);
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 22
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng đối tượng (dùng mảng)
class STACK {
private:
int *StkArray;
int StkMax;
int StkTop;
int IsEmpty();
int IsFull();
…
Trang 12Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 23
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng đối tượng (dùng mảng)…(tt)
public:
// constructors và destructor
STACK(int MaxItems = N);
STACK(const STACK &aStack);
~STACK();
// các thao tác
int Push(int newitem);
int Pop(int &outitem);
int Top(int &outitem);
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 24
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng đối tượng (dùng linked-list)
class STACK {
private:
{
NODE *pNext; // trỏ đến nút kế tiếp
};
unsigned int Count; // Số nút trong stack
NODE *pHead;
public:
// các thao tác tương tự như cách dùng mảng
}
Trang 13Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 25
So sánh một số cài đặt kiểu dữ liệu…
Cây nhị phân tìm kiếm (BST)
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 26
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng cấu trúc
typedef struct tagBT_NODE {
tagBT_NODE *pLeft; // con trỏ đến nút con trái
tagBT_NODE *pRight; // con trỏ đến nút con phải
typedef struct BIN_TREE {
BT_NODE *pRoot; // con trỏ đến nút gốc
}; // cấu trúc cây nhị phân tìm kiếm
Trang 14Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 27
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng cấu trúc…(tt)
void BSTCreate(BIN_TREE &t);
int BSTIsEmpty(const BIN_TREE &t);
BT_NODE *BSTSearch(const BT_NODE *pCurr, int Key);
int BSTInsert(BT_NODE *&pCurr, int Key);
void _Delete(BT_NODE *&pCurr);
BT_NODE *_SearchStandFor(BT_NODE *&p,
BT_NODE *pCurr);
int BSTDelete(BT_NODE *&pCurr, int Key);
void BSTNLR(const BT_NODE *pCurr);
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 28
So sánh một số cài đặt kiểu dữ liệu…
Cài đặt BST bằng hướng đối tượng
Trang 15Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 29
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng đối tượng
class BST {
private:
struct NODE // 1 nút trong cây
{
int Data;
NODE *pLeft; // trỏ đến nút con trái NODE *pRight; // trỏ đến nút con phải };
unsigned int Count; // Số nút trong cây
NODE *pRoot;
void _Delete(NODE *&pCurr);
NODE *_SearchStandFor(NODE *&p, NODE *pCurr);
…
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 30
So sánh một số cài đặt kiểu dữ liệu…
// Cài đặt theo hướng đối tượng…(tt)
public:
BST();
~BST();
int IsEmpty();
NODE *Search(const NODE *pCurr, int Key);
int Insert(NODE *&pCurr, int Key);
int Delete(NODE *&pCurr, int Key);
void NLR(const NODE *pCurr);
}
Trang 16Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 31
So sánh một số cài đặt kiểu dữ liệu…
Nhận xét ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 32
Áp dụng Template và việc xây dựng các
kiểu dữ liệu tổng quát
Vấn đề:
Ta muốn sử dụng cấu trúc Stack với các kiểu
dữ liệu khác nhau: int, char, float,…
Tất cả các thao tác căn bản không thay đổi
Nếu xây dựng theo hướng cấu trúc…
…Ta phải xây dựng nhiều kiểu Stack
Trang 17Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 33
Áp dụng Template và việc xây dựng các
kiểu dữ liệu tổng quát
Áp dụng Template và class cho phép xây
dựng các kiểu dữ liệu “tổng quát”
VD Linked-List/Stack/Queue/Tree với các
phần tử có thể là kiểu int, char, string,
struct XYZ,…
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 34
Áp dụng Template và việc xây dựng các
kiểu dữ liệu tổng quát
// Xây dựng template class STACK
template <class T> class STACK {
private:
T *StkArray;
int StkMax, StkTop;
int IsEmpty();
int IsFull();
public:
STACK(int MaxItems = N);
~STACK();
int Push(T newitem);
int Pop(T &outitem);
int Top(T &outitem);
}
Trang 18Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 35
Áp dụng Template và việc xây dựng các
kiểu dữ liệu tổng quát
// Sử dụng STACK
// với các kiểu dữ liệu khác nhau
STACK <int> intStack;
STACK <char> chrStack(1000);
STACK <float> fltStack(50);
Thanks for your attention