Professional Documents
Culture Documents
Cc khi nim
Xy dng ADT
Cc ton t
K tha
77
V. Kiu d liu tru tng
78
V. Kiu d liu tru tng
V d:
Mt hnh ch nht (Rectangle) c xc nh bi:
ta gc trn bn tri: x1, y1
ta gc di bn phi: x2, y2
tnh din tch: Area = (y2 y1) * (x2 x1)
79
V. Kiu d liu tru tng
V d (struct):
struct Rectangle
{
double x1, y1;
double x2, y2;
double Area() { return (y2 - y1) * (x2 - x1); }
};
80
V. Kiu d liu tru tng
V d (class):
class Rectangle
{
public:
double x1, y1;
double x2, y2;
double Area() { return (y2 - y1) * (x2 - x1); }
};
81
V. Kiu d liu tru tng
V d (cc i tng):
void main()
{
Rectangle r = { 1, 1, 6, 3 };
Elipse e;
e.x1 = 12; e.y1 = 2;
e.x2 = 17; e.y2 = 7;
82
V. Kiu d liu tru tng
Cc vng truy cp
83
V. Kiu d liu tru tng
Cu trc ca ADT
class tn_ADT
{
private|protected|public:
// cc bin thnh vin (cc thuc tnh)
private|protected|public:
// cc hm to
public:
// hm hy
private|protected|public:
// cc hm thnh vin khc (cc phng thc)
public:
// cc ton t thnh vin
// cc hm v cc ton t friend
};
84
V. Kiu d liu tru tng
Cu trc ca ADT
Cc hm n gin (khng cha cc vng lp hoc rt
ngn) c th nh ngha inline
class tn_ADT
{
kiu tn_hm(danh sch tham s)
{
// cc biu thc
}
};
85
V. Kiu d liu tru tng
Cu trc ca ADT
Cc hm phc tp nn nh ngha ngoi khi khai
bo ADT
class tn_ADT
{
kiu tn_hm(danh sch tham s);
};
86
V. Kiu d liu tru tng
Hm to v hm hy
Hm to (constructor)
Dng thit lp gi tr cho cc bin hoc cp pht
b nh cho cc mng ng
c gi trong cc biu thc khai bo i tng
hoc cp pht b nh
Hm hy (destructor)
Dng gii phng b nh cp pht
c gi khi kt thc khi khai bo i tng hoc
trong biu thc gii phng b nh
87
V. Kiu d liu tru tng
Hm to v hm hy
class tn_ADT
{
public:
tn_ADT(); // hm to mc nh
tn_ADT(danh sch tham s); // hm to thit lp
tn_ADT(const tn_kiu &); // hm to copy
~tn_ADT(); // hm hy
};
88
V. Kiu d liu tru tng
nh ngha hm to (inline)
class tn_ADT
{
public:
tn_ADT(danh sch tham s)
: tn_bin(biu thc)
, ...
{
// cc biu thc
}
};
89
V. Kiu d liu tru tng
V d (class Time)
class Time
{
long ticks;
public:
Time() { ticks = 0; }
Time(long value) : ticks(value) { }
Time(const Time & t) : ticks(t.ticks) { }
~Time() { }
public:
long Seconds() { return ticks / 1000; }
long Minutes() { return Seconds() / 60; }
long Hours() { return Seconds() / 3600; }
};
90
V. Kiu d liu tru tng
V d (class Time)
void main()
{
Time *p;
Time t1; // gi Time()
Time t2(1000); // gi Time(long)
Time t3 = t2; // gi Time(const Time &)
delete p; // gi ~Time() ca *p
} // gi ~Time() ca t3, t2 v t1
91
V. Kiu d liu tru tng
V d (class String)
Cc bin thnh vin v cc hm static
class String
{
char *data; // Vng d liu cha cc k t
int len; // S k t
public:
// Ly di xu src
static int GetLength(const char * src);
92
V. Kiu d liu tru tng
V d (class String)
Cc hm private
private:
// Hm to i lng cha c n k t
String(int n) { createData(n); }
93
V. Kiu d liu tru tng
V d (class String)
Cc hm to v hm hy
public:
String() { createData(0); }
94
V. Kiu d liu tru tng
V d (class String)
Cc hm public
public:
// Ly s k t
int Length() { return len; }
// So snh vi xu src
int Compare(const char * src) const;
95
V. Kiu d liu tru tng
V d (class String)
Cc ton t
public:
String operator=(const char * src);
String operator=(String & src);
// Cc ton t khc
}; // class String
96
V. Kiu d liu tru tng
V d (class String)
nh ngha cc hm
int String::GetLength(const char * src)
{
register int i = 0;
while (src[i]) ++i;
return i;
}
97
V. Kiu d liu tru tng
V d (class String)
nh ngha cc hm
98
V. Kiu d liu tru tng
Ton t gn
{
Time t1, t2;
String s1, s2;
} delete[] s2.data
delete[] s1.data sinh ra li v s1.data b xa
99
V. Kiu d liu tru tng
Ton t gn
100
V. Kiu d liu tru tng
Cc ton t s hc
// B sung ton t s hc cho Time
Time operator+(const Time right)
{
return Time(ticks + right.ticks);
}
101
V. Kiu d liu tru tng
Cc ton t kt hp
// B sung ton t kt hp cho Time
Time & operator+=(const Time right) {
ticks += right.ticks;
return *this;
}
len = s.len;
char *p = data; data = s.data; s.data = p;
return *this;
}
102
V. Kiu d liu tru tng
Cc ton t so snh
103
V. Kiu d liu tru tng
Ton t ch s
104
V. Kiu d liu tru tng
Ton t hm
kiu operator()(danh sch tham s) { ... }
V d
Ly gi tr ca hm theo mt tp cc i s
Truy cp phn t ca mng n chiu
105
V. Kiu d liu tru tng
Cc ton t tng/gim
// B sung ton t ++ cho Time
106
V. Kiu d liu tru tng
107
V. Kiu d liu tru tng
Cc ton t p kiu
108
V. Kiu d liu tru tng
109
V. Kiu d liu tru tng
M hnh
class ADT_c_s {
protected|public:
virtual void foo() { ... }
};
110
V. Kiu d liu tru tng
Cc vng truy cp
ADT_c_s
111
V. Kiu d liu tru tng
V d v s k tha
class B {
protected: int x;
public:
B(int a = 0) : x(a) { }
virtual void Print() { cout << x; }
void Inc() { x++; }
};
class D : public B {
int x;
public:
D(int a, int b) : x(a), B(b) { }
void Print() {
cout << x << ", ";
B::Print();
}
};
112
V. Kiu d liu tru tng
V d v s k tha
void main()
{
B b(5);
D d(1, 2);
d.Inc();
B *p = &b;
p->Print(); // gi B::Print() -> 5
p = &d;
p->Print(); // gi D::Print() -> 1, 3
}
113
V. Kiu d liu tru tng
Lp c s tru tng
class ADT_c_s {
...
virtual void foo() = 0;
};
114
V. Kiu d liu tru tng
Lp c s tru tng
class Shape
{
String _name;
public:
Shape(const char *name) : _name(name) { }
void Print()
{
cout << _name << ": Area = " << Area() << endl;
}
virtual double Area() = 0;
};
115
V. Kiu d liu tru tng
116
V. Kiu d liu tru tng
117
V. Kiu d liu tru tng
V d
void main()
{
Shape *s[2];
118
VI. Cc cu trc d liu c bn
ADT mu
template <class _T, int n> class Shape
{
_T edge[n]; // cc cnh
public:
_T Bound();
};
void main()
{
Shape<int, 3> tamGiac; // to ra class Shape c 3 cnh kiu int
Shape<double, 4> tuGiac;// to ra class Shape c 4 cnh kiu double
}
119
V. Kiu d liu tru tng
public:
Matrix() : data(0) { }
Matrix(int m, int n = 0); // to ma trn mxn hoc mxm
Matrix(int m, int n, const _T*); // to ma trn mxn kiu u tin
// hng t mng 1 chiu
Matrix(const Matrix& M);
~Matrix() { deleteData(); }
120
V. Kiu d liu tru tng
nh ngha cc hm ca Matrix
template <class _T> void Matrix<_T>::createData()
{
data = new _T *[rows];
for (int i = 0; i < rows; i++)
data[i] = new _T[cols];
}
121
V. Kiu d liu tru tng
Cc yu cu:
Hon thnh tt c cc hm ca class Matrix
B sung ton t gn, v cng ma trn
Xy dng class Graphic m t th c hng khng trng s k
tha t Matrix v c th s dng trong on biu thc sau:
int M[] = {
0, 1, 1, 0, 1,
1, 0, 1, 0, 0,
1, 0, 0, 1, 1,
0, 0, 1, 0, 1,
0, 1, 0, 1, 0
};
Graphic g(5, M);
g.DFT(2); // in ra mn hnh ch s cc nh
// theo chiu su bt u t nh 2
122
VI. Cc cu trc d liu c bn
Array, BoundStack v
BoundQueue
LinkedList
123
VI. Cc cu trc d liu c bn
124
VI. Cc cu trc d liu c bn
int IsEmpty();
int IsFull();
int Count();
T operator[](int index);
};
125
VI. Cc cu trc d liu c bn
int IsEmpty();
int IsFull();
int Count();
T operator[](int index);
};
126
VI. Cc cu trc d liu c bn
127
VI. Cc cu trc d liu c bn
while (!s.IsEmpty()) {
Segment b = s.Pop();
if (b.Ub - b.Lb + 1 > n0) {
int j = b.DoPart(a);
128
VI. Cc cu trc d liu c bn
int main()
{
int v[] = { 7, 5, 4, 8, 9, 1, 3, 2, 0, 6 };
Array<int> a(10);
a.CopyFrom(v);
Sort<int>::DoSort(a);
for (int i = 0; i < a.Size(); i++) cout << a[i] << ' ';
}
129
VI. Cc cu trc d liu c bn
class LinkedList
template <class _Ti> class LinkedList
{
protected:
// on nh ngha cc lp con //
baseList<_Ti> h;
int n;
public:
LinkedList() : n(0) { }
~LinkedList() { h.makeEmpty(); }
_Ti PopBegin();
_Ti PopEnd();
void RemoveAll() { h.makeEmpty(); n = 0; }
void PushBegin(const _Ti& i);
void PushEnd(const _Ti& i)
};
130
VI. Cc cu trc d liu c bn
Cc lp con
class baseList {
public:
baseList *next, *prev;
baseList() { next = prev = this; }
131
VI. Cc cu trc d liu c bn
ng dng i c s m
std::string IntToBin(int x)
{
std::string s;
LinkedList<char> stack;
do {
char c = (char)((x & 1) + 48);
x >>= 1;
stack.PushBegin(c);
} while (x);
while (!stack.IsEmpty())
s += stack.PopBegin();
return s;
}
132
VI. Cc cu trc d liu c bn
class c s
template <class _Ti> class baseBST {
public:
baseBST() { }
virtual baseBST * insert(const _Ti& ) = 0;
virtual baseBST * contents(const _Ti& ) { return 0 ; }
virtual baseBST * remove(const _Ti& ) { return this; }
virtual baseBST * getSuccessor() { return 0; }
virtual void makeEmpty() { }
virtual _Ti * Info() { return 0; }
};
133
VI. Cc cu trc d liu c bn
class BST
template <class _Ti, int comp(const _Ti&, const _Ti& ) = _compare>
class BST {
// on nh ngha cc class con //
nullBST nullBST;
baseBST<_Ti> * root;
public:
BST() { root = (baseBST<_Ti> *)&nullBST; }
~BST() { root->makeEmpty(); }
134
VI. Cc cu trc d liu c bn
void makeEmpty();
baseBST * insert(const _Ti& );
baseBST * contents(const _Ti& );
baseBST * remove(const _Ti& );
baseBST * getSuccessor();
};
135
VI. Cc cu trc d liu c bn
class VarDef
{
public:
string name;
int line;
VarDef() { }
VarDef(const char* s, int l) : name(s), line(l) { }
136
VI. Cc cu trc d liu c bn
137