Tải bản đầy đủ (.ppt) (31 trang)

DANH SÁCH LIÊN KẾT - NGĂN XẾP VÀ HÀNG ĐỢI (tt) pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (374.77 KB, 31 trang )

CHƯƠNG I : TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI
CHƯƠNG II : MỘT SỐ THUẬT TOÁN TÌM KIẾM VÀ SẮP XẾP
CHƯƠNG III : DANH SÁCH LIÊN KẾT - NGĂN XẾP VÀ HÀNG ĐỢI
CHƯƠNG IV : CÂY
I. NGĂN XẾP ( STACK )
1. Giới Thiệu
Top
LIFO: Last In First Out - Vào Sau Ra Trước.

Ngăn xếp (Stack) là một danh sách mà ta giới hạn việc thêm
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.

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
I. NGĂN XẾP ( STACK )
1. Định Nghĩa
I. NGĂN XẾP ( STACK )
2. Khai báo cấu trúc dữ liệu cho stack
NULL
pFirst
0 1 2 3 4 5 6
7
8


4
4
14
14
22
22
38
38
19
19
I. NGĂN XẾP ( STACK )
2. Khai báo cấu trúc dữ liệu cho stack
Khai 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;
};

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.
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
2.1 Cài đặt bằng DSLK

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);
}
I. NGĂN XẾP ( STACK )

2. Các phép toán trên ngăn xếp
2.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)
{
stack *p;
p = new stack;
p->info = x;
p->pNext = Top;
Top = p;
}
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
2.1 Cài đặt bằng DSLK

Pop( ): Lấy phần tử đầu danh sách.
void Pop (stack* &Top)
{
stack *p;
if (Empty (Top))
cout << “List is empty.\n”;
else {
p = Top;
Top = p->pNext;
delete p;
}
}
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp

2.1 Cài đặt bằng DSLK

GetTop( ): Lấy thông tin về phần tử đầu danh sách.
int GetTop (stack* Top)
{
stack *p;
p = Top;
if (p != NULL )
return (p->info);
else {
cout << " List is empty ";
return (-1);
}
}
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
2.1 Cài đặt bằng DSLK

DeleteAllStack( ): Xoá toàn bộ stack.
void DeleteAllStack (stack* &Top)
{
stack *p;
while (Top != NULL) // reach to end ?
{
p = Top;
Top = p->pNext;
delete p;
}
}
I. NGĂN XẾP ( STACK )

2. Các phép toán trên ngăn xếp
2.2 Cài đặt bằng mảng
0 1 2 3 4 5 6 7 8
# 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
} ;
4
4
14
14
22
22
38
38
19
19
13
13
8
8
42
42
2
21
1
I. NGĂN XẾP ( STACK )

2. Các phép toán trên ngăn xếp
2.2 Cài đặt bằng mảng

Khở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;
}
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
2.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)
{
if (FullStack(S))
cout << “Error ! Stack is full !”;
else {

S.Top_idx=S.Top_idx-1;
S.e[S.Top_idx]=X;
}
}
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
2.2 Cài đặt bằng mảng

Lấy ra phần tử đầu Stack .
void PopStack(stack &S)
{
if (!EmptyStack(S))
S.Top_idx = S.Top_idx + 1;
else
cout <<“Error ! Stack is empty”;
}
I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
2.2 Cài đặt bằng mảng

Lấy giá trị phần tử đầu Stack.
int TopStack(stack S)
{
if (!Empty_Stack(S))
return S.e[S.Top_idx];
else {
cout << “Error! Stack is empty";
return -1;
}
}

I. NGĂN XẾP ( STACK )
2. Các phép toán trên ngăn xếp
2.2 Cài đặt bằng mảng

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ử
I. NGĂN XẾP ( STACK )
3. Ứng dụng

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ỏ
void Move(int N, int A, int B, int C)
//n: so dia, A,B,C: nguon , dich va trung gian
{
if (N == 1)
cout << "Chuyen 1 dia tu : " << A << " sang " << B << "\n";
else
{
//chuyen n-1 dia tu coc nguon sang coc trung gian
Move (N-1 , A , C , B);
//chuyen 1 dia tu coc nguon sang coc dich
Move (1 , A , B , C);
//chuyen n-1 dia tu coc trung gian sang coc dich
Move (N-1 , C , B , A);
}
}
I. NGĂN XẾP ( STACK )

3. Ứng dụng
#define size 100
struct ThapHN
{
int N;
int A, B, C;
};
struct Stack
{
int n;
ThapHN e[size];
int Top_idx;
};

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";

}
}
ThapHN
I. NGĂN XẾP ( STACK )
if (N==1)
cout << "Chuyen 1 dia tu : " << A << " sang " << B << "\n";
else

{
//chuyen n-1 dia tu coc nguon sang coc trung gian
Move(N-1, A,C,B);
//chuyen 1 dia tu coc nguon sang coc dich
Move(1,A,B,C);
//chuyen n-1 dia tu coc trung gian sang coc dich
Move(N-1,C,B,A);
}
nguon , dich , trung gian
II. HÀNG ĐỢI (QUEUE)
1. Định Nghĩa
II. HÀNG ĐỢI (QUEUE)
Hàng đợi, hay ngắn gọn là hàng (queue) cũng là một danh sách đặc
biệt mà phép thêm vào chỉ thực hiện tại một đầu của danh sách, gọi là
cuố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".
1. Định Nghĩa
0 1 2 3 4 5 6 7 8
14
14
13
13
8
8
42
42
1

1
FRONT
REAR
II. HÀNG ĐỢI (QUEUE)
1. Khai báo cấu trúc dữ liệu cho hàng đợi
Khai 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
};
Khai báo hàng đợi dạng DSLK
struct node
{
int info;
node* pNext;
};
struct Queue
{
node* Front;
node* Rear;
};
2. Các phép toán trên hàng đợi
2.1 Cài đặt bằng DSLK

Khở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);
}
II. HÀNG ĐỢI (QUEUE)

×