vào hoặc loại bỏ một phần tử chỉ thực hiện tại một đầu của danh sách, đầu này gọi là đỉnh TOP của ngăn xếp.. Các thao tác trong stack: Push: chèn phần tử mới vào stack Pop: lấy phầ
Trang 1CHƯƠNG IV : CÂY
Trang 2LIFO: Last In First Out - Vào Sau Ra Trước.
Trang 3vào hoặc loại bỏ một phần tử chỉ thực hiện tại một đầu của danh sách, đầu này gọi là đỉnh (TOP) của ngăn xếp
LIFO: Last In First Out - vào sau ra trước.
Các thao tác trong stack:
Push: chèn phần tử mới vào stack
Pop: lấy phần tử đầu stack ra khỏi stack
Top: kiểm tra phần tử đầu stack
Trang 4pFirst
Trang 5Khai báo ngăn xếp dạng mảng
# define size 200
struct stack
{
int n;
<Kiểu dữ liệu> e [size];
int Top_idx; //giữ vị trí đỉnh ngăn xếp
};
Khai báo ngăn xếp dạng DSLK
struct stack {
int info;
stack *pNext;
};
Trang 6 Tạo một ngăn xếp rỗng
Hàm trả về phần tử tại đỉnh ngăn xếp Nếu ngăn xếp rỗng thì hàm không xác định.
Chương trình con xoá một phần tử tại đỉnh ngăn xếp.
Chương trình con thêm một phần tử x vào đầu ngăn xếp.
Hàm kiểm tra ngăn xếp rỗng Hàm cho kết quả 1 (true) nếu ngăn xếp rỗng và 0 (false) trong trường hợp ngược lại
Trang 7 InitializeStack: Khởi động một Stack Ban đầu Stack chưa có phần tử.
void InitializeStack ( stack* & Top)
{
Top = NULL;
}
EmptyStack( ): Kiểm tra Stack rỗng.
int EmptyStack ( stack * Top)
{
return (Top == NULL ? 1 : 0);
Trang 82.1 Cài đặt bằng DSLK
Push( ): thêm một phần tử có nội dung x vào đầu Stack.
void Push ( stack* & Top, int x)
Trang 9 Pop( ): Lấy phần tử đầu danh sách.
void Pop ( stack* & Top)
Trang 10return (-1);
} }
Trang 11 DeleteAllStack( ): Xoá toàn bộ stack.
void DeleteAllStack ( stack* & Top)
Trang 12<Kiểu dữ liệu> e [size ];
int Top_idx; //giữ vị trí đỉnh ngăn xếp
} ;
4
13 8
42 2
Trang 13Khởi tạo một Stack Ban đầu Stack chưa có phần tử.
void InitializeStack( stack &S)
{
S.Top_idx = size;
}
Kiểm tra Stack rỗng.
int EmptyStack ( stack S)
{
return S.Top_idx == size;
Kiểm tra Stack đầy.
int FullStack ( stack S) {
return S.Top_idx == 0;
Trang 142.2 Cài đặt bằng mảng
Thêm một phần tử có nội dung x vào đầu Stack.
void PushStack( int X , stack & S)
Trang 15 Lấy ra phần tử đầu Stack
void PopStack( stack &S)
Trang 162.2 Cài đặt bằng mảng
Lấy giá trị phần tử đầu Stack.
int TopStack( stack S)
Trang 17 Xoá toàn bộ stack.
Gọi Hàm khởi tạo vì dãy không cần phải xóa phần tử
Trang 18 Giải bài toán tháp HN
Có ba cọc A,B,C Khởi đầu cọc A có một số đĩa xếp theo thứ tự nhỏ dần lên trên đỉnh Bài toán đặt ra là phải chuyển toàn bộ chồng đĩa từ A sang B Mỗi lần thực hiện chuyển một đĩa từ một cọc sang một cọc khác và không được đặt đĩa lớn nằm trên đĩa nhỏ
Trang 19if (N == 1) cout << "Chuyen 1 dia tu : " << A << " sang " << B << "\n";
Trang 20 Lấy giá trị phần tử đầu Stack.
int Top( Stack S) {
if (!EmptyStack(S))
return S.e[S.Top_idx];
else { cout << “Error! Stack is empty";
} }
Trang 21if (N==1) cout << "Chuyen 1 dia tu : " << A << " sang " << B << "\n"; else
Trang 23cuối hàng (REAR), còn phép loại bỏ thì thực hiện ở đầu kia của danh sách, gọi là đầu hàng (FRONT) Xếp hàng mua vé xem phim là một
hình ảnh trực quan của khái niệm trên, người mới đến thêm vào cuối hàng còn người ở đầu hàng mua vé và ra khỏi hàng, vì vậy hàng còn
được gọi là cấu trúc FIFO (first in - first out) hay "vào trước - ra trước".
14 13
8 42
1
FRONT REAR
Trang 24Khai báo hàng đợi bằng mảng
# define size 200
struct Queue
{
int n;
<Kiểu dữ liệu> e[size ];
int Front; //giữ vị trí đầu hàng đợi
int Rear; //giữ vị trí cuối hàng đợi
Trang 25Khởi động một queue Ban đầu queue chưa có phần tử.
void MakeNullQueue( Queue & Q)
{
Q.Front = NULL;
Q.Rear = NULL;
}
Kiểm tra Queue rỗng.
int EmptyQueue( Queue Q)
{
return (Q.Front == NULL ? 1 : 0);
Trang 262.1 Cài đặt bằng DSLK
Thêm một phần tử có nội dung x vào Queue
void EnQueue ( int x, Queue & Q )
Trang 27 Lấy ra phần tử đầu Queue
void DeQueue ( Queue &Q)
Trang 288 7 6 5 4 3 2 1 0
FRONT
REAR
14 13
8 42
1
Trang 29void MakeNullQueue( Queue &Q)
{
Q.Front = -1;
Q.Rear = -1
}
Kiểm tra Queue rỗng.
int EmptyQueue( Queue Q)
{
return Q.Front = -1;
}
Kiểm tra Queue đầy.
int FullQueue( Queue Q ) {
return (Q.Rear - Q.Front + 1) == size; }
Trang 30 Thêm một phần tử có nội dung x vào Queue
void EnQueue(int X,Queue &Q)
{ //Di chuyen tinh tien ra truoc Front -1 vi tri
for(int i = Q.Front; i <= Q.Rear; i++)
Q.e[i-Q.Front] = Q.e[i]; //Xac dinh vi tri Rear moi
Q->Rear = MaxLength – Q.Front-1; Q.Front=0;
} //Tang Rear de luu noi dung moi
Q.Rear = Q.Rear+1;
Q.e[Q.Rear] = X; }
cout << “Error: Queue is full !";
}
Trang 31void DeQueue( Queue & Q)