Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 5: Hàng đợi - Đào Nam Anh

 Khái niệm Queue  Các thao tác trên Queue  Hiện thực Queue  Ứng dụng của Queue • 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 vào Queue luôn diễn ra ở cuối Queue và việc lấy một đối tượng ra khỏi Queue luôn diễn ra ở đầu Queue • Việc thêm một đối tượng vào Queue hoặc lấy một đối tượng ra khỏi Queue được thực hiện theo cơ chế FIFO (First In First Out - Vào trước ra trước)

pdf21 trang | Chia sẻ: candy98 | Lượt xem: 711 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 5: Hàng đợi - Đào Nam Anh, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Data Structure and Algorithm 1 DATA STRUCTURE AND ALGORITHM Queue CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT HÀNG ĐỢI Dr. Dao Nam Anh Data Structure and Algorithm 2 Outline – Nội dung Khái niệm Queue Các thao tác trên Queue Hiện thực Queue Ứng dụng của Queue Data Structure and Algorithm 3 Resource - Reference Slides adapted from David Matuszek, Marty Stepp and Hélène Martin, edit by Dao Nam Anh. Major Reference: • Robert Sedgewick, and Kevin Wayne, “Algorithms” Princeton University, 2011, Addison Wesley • Algorithm in C (Parts 1-5 Bundle)- Third Edition by Robert Sedgewick, Addison-Wesley • Cấu trúc dữ liệu và giải thuật, Đinh Mạnh Tường. • Giải thuật và lập trình, Lê Minh Hoàng, Đại Học Sư Phạm, 2002 Data Structure and Algorithm 4 Queues • 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 vào Queue luôn diễn ra ở cuối Queue và việc lấy một đối tượng ra khỏi Queue luôn diễn ra ở đầu Queue • Việc thêm một đối tượng vào Queue hoặc lấy một đối tượng ra khỏi Queue được thực hiện theo cơ chế FIFO (First In First Out - Vào trước ra trước) Data Structure and Algorithm 5 Queues Hàng đợi hỗ trợ các thao tác: • Add - EnQueue(): Thêm đối tượng vào cuối (rear) Queue • Remove - DeQueue(): Lấy đối tượng ở đầu (front) Queue ra khỏi Queue • Peek: Examine the front element. queue front back 1 2 3 addremove, peek Data Structure and Algorithm 6 Queues Queue còn hỗ trợ các thao tác: • isEmpty(): Kiểm tra xem hàng đợi có rỗng không • Front(): Trả về giá trị của phần tử nằm ở đầu hàng đợi mà không hủy nó. Nếu hàng đợi rỗng thì lỗi sẽ xảy ra queue front back 1 2 3 addremove, peek Data Structure and Algorithm 7 Ứng dụng Hàng đợi • Cuộc sống hàng ngày: Xếp hàng đợi thang máy Hàng xe ô tô tại trạm xăng • Programming: Mô hình hàng đợi của khách hàng Hàng đợi các phép tính cần tính • Hệ điều hành: Hàng đợi các tệp ra máy in Hàng đợi các chương trình để chạy Hàng đợi các gói tin gửi lên mạng Data Structure and Algorithm 8 Mô tả Queue bằng mảng Có thể tạo một Queue bằng cách sử dụng một mảng 1 chiều theo kiểu xoay vòng (coi phần tử an-1 kề với phần tử a0) • Hàng đợi chứa tối đa N phần tử • Phần tử ở đầu hàng đợi sẽ có chỉ số front • Phần tử ở cuối hàng đợi sẽ có chỉ số rear 17 23 97 44 0 1 2 3 4 5 6 7 myQueue: rear = 3front = 0 David Matuszek Data Structure and Algorithm 9 Mô tả Queue bằng mảng • A queue is a first in, first out (FIFO) data structure • This is accomplished by inserting at one end (the rear) and deleting from the other (the front) • To insert: put new element in location 4, and set rear to 4 17 23 97 44 23 0 1 2 3 4 5 6 7 myQueue: rear = 4front = 0 David Matuszek Data Structure and Algorithm 10 Mô tả Queue bằng mảng • A queue is a first in, first out (FIFO) data structure • This is accomplished by inserting at one end (the rear) and deleting from the other (the front) • To insert: put new element in location 4, and set rear to 4 • To delete: take element from location 0, and set front to 1 17 23 97 44 0 1 2 3 4 5 6 7 myQueue: rear = 3front = 1 David Matuszek Data Structure and Algorithm 11 Mô tả Queue bằng mảng • Dùng mảng: Có xu hướng dời về cuối mảng • Hai cách hiện thực:  Khi lấy một phần tử ra thì đồng thời dời ô lên một vị trí  Khi lấy một phần tử ra thì không dời ô lên: 17 23 97 44 333Chèn: 23 97 44 333Xóa: rear = 4front = 1 17 23 97 44Ban đầu: rear = 3front = 0 Data Structure and Algorithm 12 Mô tả Queue bằng danh sách vòng • Dùng mảng lưu Hàng đợi với danh sách vòng 11 0 1 2 3 4 5 6 7 myQueue: rear = 5 front = 5 • Thêm vào hàng đợi các số 11, 22, 33, 44, 55, và sẽ xóa đi trong cùng thứ tự • Tính: front = (front + 1) % myQueue.length; và: rear = (rear + 1) % myQueue.length; Data Structure and Algorithm 13 Mô tả Queue bằng danh sách vòng • Dùng mảng lưu Hàng đợi với danh sách vòng 11 22 0 1 2 3 4 5 6 7 myQueue: rear = 6 front = 5 • Thêm vào hàng đợi các số 11, 22, 33, 44, 55, và sẽ xóa đi trong cùng thứ tự • Tính: front = (front + 1) % myQueue.length; và: rear = (rear + 1) % myQueue.length; Data Structure and Algorithm 14 Mô tả Queue bằng danh sách vòng • Dùng mảng lưu Hàng đợi với danh sách vòng 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 7 front = 5 • Thêm vào hàng đợi các số 11, 22, 33, 44, 55, và sẽ xóa đi trong cùng thứ tự • Tính: front = (front + 1) % myQueue.length; và: rear = (rear + 1) % myQueue.length; Data Structure and Algorithm 15 Mô tả Queue bằng danh sách vòng • Dùng mảng lưu Hàng đợi với danh sách vòng 44 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 0 front = 5 • Thêm vào hàng đợi các số 11, 22, 33, 44, 55, và sẽ xóa đi trong cùng thứ tự • Tính: front = (front + 1) % myQueue.length; và: rear = (rear + 1) % myQueue.length; Data Structure and Algorithm 16 Mô tả Queue bằng danh sách vòng • Dùng mảng lưu Hàng đợi với danh sách vòng 44 55 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 1 front = 5 • Thêm vào hàng đợi các số 11, 22, 33, 44, 55, và sẽ xóa đi trong cùng thứ tự • Tính: front = (front + 1) % myQueue.length; và: rear = (rear + 1) % myQueue.length; Data Structure and Algorithm 17 Full and empty queues • Hàng đợi có thể đầy: • Hàng đợi có thể rỗng: 44 55 66 77 88 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 4 front = 5 0 1 2 3 4 5 6 7 myQueue: rear = 4 front = 5 Đó là vấn đề! Data Structure and Algorithm 18 Full and empty queues: solutions • Giải pháp 1: Dùng thêm 1 biến phụ • Giải pháp 2: Giữ 1 ô trống: Coi như hàng đợi chỉ có n-1 ô 44 55 66 77 88 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 4 front = 5count = 8 44 55 66 77 11 22 33 0 1 2 3 4 5 6 7 myQueue: rear = 3 front = 5 Data Structure and Algorithm 19 Mô tả Queue bằng danh sách nối đơn • Có thể tạo một hàng đợi sử dụng một DSLK đơn • Phần tử đầu DSKL (phead) sẽ là phần tử đầu Queue (front), phần tử cuối DSKL (ptail) sẽ là phần tử cuối Queue (rear) struct Node { DataType data; Node *pNext; }; struct Queue { Node *front, *rear; }; Data Structure and Algorithm 20 Mô tả Queue bằng danh sách nối đơn • Tương tự như cài đặt Stack bằng danh sách nối đơn kiểu LIFO, ta cũng không kiểm tra Queue tràn trong trường hợp mô tả Queue bằng danh sách nối đơn kiểu FIFO Data Structure and Algorithm 21 Discussion – Câu hỏi • https://sites.google.com/site/daonamanhedu/data- structure-algorithm