Upload
hiep0109
View
1.010
Download
0
Embed Size (px)
Citation preview
Chương 3.2: NGĂN XẾP – HÀNG ĐỢI
(Stack - Queue)
Chương 3: Ngăn xếp – Hàng đợi
Nội dung
Ngăn xếp (Stack) Hàng đợi (Queue)
2
Chương 3: Ngăn xếp – Hàng đợi
Nội dung3
Ngăn xếp (Stack) Khái niệm Stack Các thao tác trên Stack Hiện thực Stack Ứng dụng của Stack
Chương 3: Ngăn xếp – Hàng đợi
Stack - Khái niệm
Stack là một danh sách mà các đối tượng được thêm vào và lấy ra chỉ ở một đầu của danh sách
Vì thế, thao tác trên Stack được thực hiện theo cơ chế LIFO (Last In First Out - Vào sau ra trước)
4
Chương 3: Ngăn xếp – Hàng đợi
Stack – Các thao tác
Stack hỗ trợ 2 thao tác chính: Push: Thêm 1 đối tượng vào Stack Pop: Lấy 1 đối tượng ra khỏi Stack
Ví dụ:5 2 3 - - 4
Stack cũng hỗ trợ một số thao tác khác:
isEmpty(): Kiểm tra xem Stack có rỗng không
Top(): Trả về giá trị của phần tử nằm ở đầu
Stack mà không hủy nó khỏi Stack. Nếu Stack
rỗng thì lỗi sẽ xảy ra
5
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Stack dùng DSLK6
Khai báo các cấu trúc:
struct Node{
DataType data;Node *next;
};struct Stack{
Node *top;};
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Stack dùng DSLK (tt.)
Khởi tạo Stack:
7
void Khoitao(Stack &s){
s.top = NULL;}
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Stack dùng DSLK (tt.)
Kiểm tra xem Stack có rỗng không:
8
int isEmpty ( Stack s ){
return s.top == NULL ? 1 : 0; }
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Stack dùng DSLK (tt.)
Thêm một phần tử vào Stack:
9
void Push ( Stack &s, DataType x ){
Node *p = new Node;if ( p==NULL ) { cout<<“Khong du bo nho”; return; }p->data = x;p->next = NULL;if (s.top==NULL) // if (isEmpty(s))
s.top = p;else{
p->next = s.top;s.top = p;
}}
Thêm phần tử vào đầu danh sách
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Stack dùng DSLK (tt.)
Lấy một phần tử ra khỏi Stack:
10
DataType Pop ( Stack &s ){
if ( s.top==NULL ){cout<<"Stack rỗng"; return 0;
}DataType x;Node *p = s.top;s.top = s.top->next;x = p->data;delete p;return x;
}
Lấy và xóa phần tử ở đầu danh sách
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Stack dùng DSLK (tt.)
Xem phần tử ở đỉnh Stack:
11
DataType Top ( Stack s ){
if ( s.top==NULL ){cout<<"Stack rỗng"; return 0;
}DataType x;x = s.top->data;return x;
}
Chương 3: Ngăn xếp – Hàng đợi12
Stack - Ứng dụng
57 2
1 28 2
0 14 2
0 7 2
1 3 2
1 1 2
1 0
57 = 1110012
Ví dụ: 57 = ???2
Bài tập: đổi số từ cơ số 10 sang cơ số x
Chương 3: Ngăn xếp – Hàng đợi
Nội dung
Ngăn xếp (Stack) Hàng đợi (Queue)
Khái niệm Queue Các thao tác trên Queue Hiện thực Queue Ứng dụng Queue
13
Chương 3: Ngăn xếp – Hàng đợi
Queue - Khái niệm
Queue là một danh sách mà các đối tượng được thêm vào ở một đầu của danh sách và lấy ra ở một đầu kia của danh sách
Việc thêm một đối tượng luôn diễn ra ở cuối Queue và việc lấy ra một đối tượng luôn diễn ra ở đầu Queue
Vì thế, thao tác trên Queue được thực hiện theo cơ chế FIFO (First In First Out - Vào trước ra trước)
14
Chương 3: Ngăn xếp – Hàng đợi
Queue - Khái niệm15
Imaging
Chương 3: Ngăn xếp – Hàng đợi
Queue – Các thao tác
Queue hỗ trợ 2 thao tác chính: EnQueue(): Thêm đối tượng vào cuối (rear) Queue DeQueue(): Lấy đối tượng ở đầu (front) Queue
Ví dụ:5 3 2 - - 4
Queue còn hỗ trợ các thao tác:
isEmpty(): Kiểm tra xem Queue có rỗng không
Front(): Trả về giá trị phần tử nằm ở đầu Queue mà không hủy nó.
Nếu Queue rỗng thì lỗi sẽ xảy ra
16
Front Rear
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Queue dùng DSLK17
Có thể biểu diễn Queue bằng cách sử dụng DSLK đơn Có 2 lựa chọn (cách nào tốt nhất?):
head sẽ là front, tail sẽ là rear
head sẽ là rear, tail sẽ là front
b c m nfront
rear
a
b c m nrear
front
a
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Queue dùng DSLK18
Khai báo các cấu trúc:
struct Node{
DataType data;Node *next;
};struct Queue{
Node *front, *rear;};
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Queue dùng DSLK
Khởi tạo Queue rỗng:
Kiểm tra hàng đợi rỗng :
19
void Khoitao(Queue &q){
q.front = q.rear = NULL; }
int isEmpty(Queue &q){
if ( q.front==NULL ) return 1;
else return 0;
}
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Queue dùng DSLK
Thêm một phần tử p vào cuối Queue:
20
void EnQueue(Queue &q, DataType x){
Node *p = new Node;if (p==NULL) exit(1); //Khong du bo nhop->next = NULL;p->data = x;if (q.front==NULL) // TH Queue rỗngq.front = q.rear = p;else{
q.rear->next = p;q.rear = p;
}}
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Queue dùng DSLK
Lấy phần tử ra khỏi Queue:
21
DataType DeQueue(Queue &q){
if (isEmpty(q)) {cout<<“Queue rong”;return 0;
}Node *p = q.front;DataType x = p->data;q.front = q.front->pNext;if ( q.front==NULL ) q.rear =
NULL;delete p;return x;
}
Chương 3: Ngăn xếp – Hàng đợi
Hiện thực Queue dùng DSLK
Xem thông tin của phần tử ở đầu Queue:
DataType Front(Queue q){
if (isEmpty(q)) {
cout<<“Queue rong”;return 0;
}return q.front->data;
}