stack & queue

48
NỘI DUNG Kiểu dữ liệu Stack & Queue Cài đặt Stack & Queue Các cơ chế an toàn Ứng dụng thực tiễn

Upload: ky-ton-that

Post on 13-Feb-2017

97 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Stack & queue

NỘI DUNG Kiểu dữ liệu Stack & Queue Cài đặt Stack & Queue Các cơ chế an toàn Ứng dụng thực tiễn

Page 2: Stack & queue

DANH SÁCH Danh sách

Dãy hữu hạn phần tử Các thao tác: tạo mới, hủy, thêm, xóa, …

Danh sách và mảng Ví dụ minh họa

Page 3: Stack & queue

DANH SÁCH ĐẶC, DANH SÁCH LIÊN KẾT Danh sách đặc: dùng mảng cài đặt Danh sách liên kết: dùng cấu trúc liên kết So sánh về mặt sử dụng bộ nhớ So sánh về mặt thao tác

1 3 5 8 …

1 o 3 o 5 o 8 o

NULL

max_count = 100

Page 4: Stack & queue

1

DANH SÁCH HẠN CHẾ Danh sách: Thêm, xóa ở vị trí bất kỳ Stack: Thêm, xóa từ một đầu Queue: Thêm đầu này, xóa đầu kia Dùng List như Stack hoặc Queue?

3 7 9

5

1 3 7 9571 3 9

Page 5: Stack & queue

NGĂN XẾP Stack: Thêm, xóa phần tử từ một đầu (top) Stack là cấu trúc LIFO (Last In First Out)

Page 6: Stack & queue

HÀNG ĐỢI Queue: Thêm vào đầu này, lấy ra đầu kia Queue là cấu trúc FIFO (First In First Out)

1234

4

125 345

Page 7: Stack & queue

CÀI ĐẶT Danh sách đặc Danh sách liên kết

Page 8: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH ĐẶC (Stack.h)const max_stack = 100; // kích thước tối đatemplate <class Stack_Element> // Stack_Element=int, double, string, Employee class Stack{private: // định nghĩa cấu trúc dữ liệuint count; // vị trí top, số phần tửStack_Entry entry[max_stack];public: // định nghĩa các thao tác trừu tượngStack(); // hàm khởi tạo mặc địnhbool empty() const;bool full() const;bool push(const Stack_Entry &item);bool pop();};

count

Page 9: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH ĐẶC (Stack.cpp)template <class Stack_Element>Stack<Stack_Element>::Stack(){

count = 0;}

bool Stack<Stack_Element>::push(const Stack_Entry &item){

bool outcome = true;if full()

outcome = false;else

entry[count++] = item;return outcome;

}

count

count

item

count

item

item

Page 10: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH ĐẶC (Stack.cpp)template <class Stack_Element>bool Stack<Stack_Element>::pop(){

bool outcome = true;if empty()

outcome = false;else

count--;return outcome;

}

count

count

count

Page 11: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH ĐẶC (Stack.cpp)template <class Stack_Element>bool Stack<Stack_Element>::empty() const{

return (count == 0);}template <class Stack_Element>bool Stack<Stack_Element>::full() const{

return (count == max_stack);}

count

count=max_stack

.

.

.

Page 12: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH LIÊN KẾTtemplate <class Node_Entry>struct Node{Node_Entry entry;Node<Node_Entry> *next;Node(); // hàm khởi tạo mặc địnhNode(Node_Entry item, Node<Node_Entry> *link=NULL);};template <class Node_Entry>Node<Node_Entry>::Node(){next = NULL;}template <class Node_Entry>Node<Node_Entry>::Node(Node_Entry item, Node<Node_Entry> *link){entry = item;next = link;}

entrynext

item entry

Page 13: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH LIÊN KẾTtemplate <class Node_Entry>class Stack {private:

Node<Node_Entry> *top_node;public:

Stack(); // hàm khởi tạo mặc địnhbool empty() const;//bool full() const;bool push(const Node_Entry &item);bool pop();

};

entry

Page 14: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH LIÊN KẾTtemplate <class Node_Entry>Stack<Node_Entry>::Stack(){

top_node = NULL;}

template <class Node_Entry>bool Stack<Node_Entry>::empty() const{

return (top_node == NULL);}

entry

Page 15: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH LIÊN KẾTtemplate <class Node_Entry>bool Stack<Node_Entry>::push(const Node_Entry &item){

Node<Node_Entry> *new_top = new Node<Node_Entry>(item, top_node);if (new_top == NULL)

return false;top_node = new_top;return true;

}

entry entry entryitem

Page 16: Stack & queue

CÀI ĐẶT NGĂN XẾP BẰNGDANH SÁCH LIÊN KẾTtemplate <class Node_Entry>bool Stack<Node_Entry>::pop(){Node<Node_Entry> *old_top = top_node;if (empty())return false;top_node = old_top->next; // new top_nodedelete old_top;return true;}

entry entry entryentry

Page 17: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH ĐẶC Mảng tuyến tính (linear array) Mảng vòng (circular array) Hàng đợi trong thực tế?

0 1 2 3

front

4 5 6

rear

0 1 2 3

front

4 5 6 7 8 9

rear

7 8 9

rear

rear

0

Page 18: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH ĐẶC Hàng đợi rỗng Hàng đợi đầy

frontrear front

frontrear rear

Page 19: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH ĐẶCconst max_queue = 100;template <class Entry_Element>class Queue{private:int count; // số phần tửint front; // vị trí đầu hàng đợiint rear; // vị trị cuối hàng đợiEntry_Element entry[max_queue]; public:Queue(); // hàm khởi tạo mặc địnhbool empty() const;bool full() const;bool serve(); // dequeuebool append(const Queue_Entry &item); // enqueue};

item item item item

count = 4

frontrear

Page 20: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH ĐẶCtemplate <class Queue_Element>Queue<Queue_Element>::Queue(){count = 0;front = 0;rear = max_queue - 1;}

front rear

Page 21: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH ĐẶCtemplate <class Queue_Element>bool Queue<Queue_Element>::empty() const{return (count == 0);}

template <class Queue_Element>bool Queue<Queue_Element>::full() const{return (count == max_queue);}

front rear

Page 22: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH ĐẶCtemplate <class Queue_Element>bool Queue<Queue_Element>::append(const Queue_Element &item) {if (full()) // queue đầyreturn false;count++;//rear = ((rear + 1) == max_queue) ? 0 : (rear + 1);rear = (rear + 1) % max_queue;entry[rear] = item;return true;}

front rear

item

rear

item

rear rear

Page 23: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH ĐẶCtemplate <class Queue_Element>bool Queue<Queue_Element>::serve(){if (empty())return false;count--;//front = ((front + 1) == max_queue) ? 0 : (front + 1);front = (front + 1) % max_queue;return true;}

front rearfront front

Page 24: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH LIÊN KẾTtemplate <class Node_Entry>class Queue{private:Node<Node_Entry> *front;Node<Node_Entry> *rear;public:Queue(); // hàm khởi tạo mặc địnhbool empty() const;//bool full() const;bool append(const Node_Entry &item);bool serve();};

Node_Entry

front rear

Page 25: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH LIÊN KẾTtemplate <class Node_Entry>Queue<Node_Entry>::Queue(){front = NULL;rear = NULL;}

template <class Node_Entry>bool Queue<Node_Entry>::empty(){return (front == NULL);}

Page 26: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH LIÊN KẾTtemplate <class Node_Entry>bool Queue<Node_Entry>::append(const Node_Entry &item){Node<Node_Entry> *new_rear = new Node<Node_Entry>(item);if (new_rear == NULL)return false;if (rear == NULL){front = new_rear;rear = new_rear;}else{rear->next = new_rear;rear = new_rear;}

}

Node_Entry

front rear

item

item

Page 27: Stack & queue

CÀI ĐẶT HÀNG ĐỢI BẰNG DANH SÁCH LIÊN KẾTtemplate <class Node_Entry>bool Queue<Node_Entry>::serve(){if (empty())return false;Node<Node_Entry> *old_front = front;front = old_front->next;if (front == NULL) // danh sách có 1 phần tửrear = NULL;delete old_front;return true;

}

Node_Entry

Node_Entry

Page 28: Stack & queue

LỖI THƯỜNG GẶP ‘Không thể lấy nước từ bình rỗng’ Con trỏ đến đối tượng đã bị hủy Chưa qua cầu đã rút ván

p NULL

del

top

top

Page 29: Stack & queue

CƠ CHẾ AN TOÀN

Tại sao cấu trúc liên kết không an toàn? Bộ nhớ không tự hủy Truyền tham biến

Các cơ chế an toàn Cài đặt hàm hủy tạo destructor Định nghĩa chồng toán tử gán Cung cấp hàm khởi tạo mặc định

Page 30: Stack & queue

HÀM HỦY TẠO (DESTRUCTOR) Tại sao cần hàm hủy tạo?

for (int i = 0; i < 1000000; i++){

Stack small;small.push(some_data);

}

some_datatop_node

some_data

some_data

some_data

some_data

Page 31: Stack & queue

HÀM HỦY TẠO (DESTRUCTOR)Stack::~Stack(){

while (!empty())pop(); // hủy Node

}

Page 32: Stack & queue

TOÁN TỬ GÁN(ASSIGNMENT OPERATOR)Stack outer_stack;for (int i = 0; i < 1000000; i++){

Stack inner_stack;inner_stack.push(some_data);inner_stack = outer_stack;

}

outer_stack.top_node

some_data

inner_stack.top_node

some_data

some_data

Page 33: Stack & queue

TOÁN TỬ GÁN(ASSIGNMENT OPERATOR)void Stack::operator=(const Stack &original){

Node *new_top;Node *new_copy;Node *original_node = original.top_node;if (original_node == NULL)

new_top = NULL;else{

new_top = new Node(original_node->entry);while (original_node->next != NULL){

original_node = original_node->next;new_copy->next = new Node(original_node->entry);

new_copy = new_copy->next;}

}}

Page 34: Stack & queue

TOÁN TỬ GÁN(ASSIGNMENT OPERATOR)

original_node

new_top

new_copy

original_top

top_nodetop_node

Page 35: Stack & queue

HÀM KHỞI TẠO SAO CHÉP(COPY CONSTRUCTOR) Hàm khởi tạo mặc định Hàm khởi tạo sao chép Tại sao phải dùng hàm khởi tạo sao chép?

void destroy_the_stack(Stack copy){}int main(){

Stack vital_data;destroy_the_stack(vital_data);

}

out_top

in_top

Page 36: Stack & queue

HÀM KHỞI TẠO SAO CHÉP(COPY CONSTRUCTOR)template <class Node_Entry>Stack<Node_Entry>::Stack(const Stack<Node_Entry> &copy){

Node<Node_Entry> *new_copy;Node<Node_Entry> *original_node = original.top_node;if (original_node == NULL)

top_node = NULL;else{

new_copy = new Node<Node_Entry>(original_node->entry);top_node = new_copy;while (original_node = original_node->next != NULL){

original_node = original_node->next;new_copy->next = new Node<Node_Entry>(original->entry);new_copy = new_copy->next;

}}

}

Page 37: Stack & queue

HÀM KHỞI TẠO SAO CHÉP(COPY CONSTRUCTOR)

original_node

top_node

new_copy

original_top

Page 38: Stack & queue

ỨNG DỤNG THỰC TIỄN

T T TT T CPUT

Giả lặp xử lý song song: cơ chế Round Robin

Page 39: Stack & queue

ỨNG DỤNG THỰC TIỄN

BEGIN...CALL A...

RETURNEND

MAIN

MAIN

BEGIN...CALL B...

RETURNEND

SUB A

SUB A

BEGIN....RETURNEND

SUB B

Page 40: Stack & queue

ỨNG DỤNG THỰC TiỄN

Page 41: Stack & queue

TỔNG KẾT Ứng dụng đa dạng Hàng đợi: công việc có kể thứ tự trước

sau Ngăn xếp: công việc có tính chất quay

lui

Page 42: Stack & queue

THAM KHẢO Tìm kiếm chiều rộng Tìm kiếm chiều sâu Gọi chương trình con Cú pháp hậu tố Lỗi cài toán tử gán Danh sách liên kết vòng Danh sách liên kết kép

Page 43: Stack & queue

ỨNG DỤNG THỰC TIỄN

10 3

5

2 7 12

8 5

510

3

2

10 3 2 7 1

2

712

Tìm kiếm theo chiều rộng

Page 44: Stack & queue

ỨNG DỤNG THỰC TIỄN

10 3

5

2 7 12

8 5

5102

7

10 32 7 1

2

312

Tìm kiếm theo chiều rộng

Page 45: Stack & queue

ỨNG DỤNG THỰC TIỄN

2 * 4 - (9 + 5) (= -6)2 * 4 - 9 + 5 (= 4)

2 4 * 9 5 + -

8

2

44

2

8

9

5

5

9

1414

-6

Cú pháp hậu tố Ban Lan

Page 46: Stack & queue

HÀM HỦY TẠO (DESTRUCTOR) Tại sao cần hàm hủy tạo? Xét ví dụ:

for (int i = 0; i < 1000000; i++){

Stack small;small.push(some_data);

}

some_datatop_node

some_data

some_data

some_data

some_data

Page 47: Stack & queue

HÀM KHỞI TẠO SAO CHÉP(COPY CONSTRUCTOR)

top_node

original_top

x x

Page 48: Stack & queue

LIÊN KẾT KÉP, LIÊN KẾT VÒNG

min max

List