Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 13: Hàng đợi - Queues tìm hiểu về khái niệm về hàng đợi, xây dựng và sử dụng Queue, ví dụ về hàng đợi. Để nắm chi tiết nội dung kiến thức, mời các bạn cùng tham khảo bài giảng.
Cấu trúc liệu giải thuật Bài 13 Hàng đợi - Queues Giảng viên: TS Ngo Huu Phuc Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University Bài 13 Hàng đợi - Queues Nội dung: 13.1 Khái niệm hàng đợi 13.2 Xây dựng sử dụng Queue 13.3 Ví dụ hàng đợi Tham khảo: Data structures and Algorithms Stacks.htm, Kyle Loudon Mastering Algorithms, Chapter Stacks and Queues, Elliz Horowitz – Fundamentals of Data Structures Chapter Stacks and Queues, Deshpande Kakle – C and Data Structures Bài giảng TS Nguyễn Nam Hồng @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (1/8) @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (2/8) Trong ứng dụng máy tính, định nghĩa CTDL hàng đợi danh sách, việc thêm phần tử thực đầu danh sách (cuối hàng đợi) việc lấy phần tử thực cuối danh sách (đầu hàng) Hàng đợi gọi danh sách FIFO (First In First Out) Ví dụ hàng đợi @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (3/8) Đối với hàng đợi, số lượng ứng dụng có nhiều ngăn xếp Ví dụ máy tính thực nhiệm vụ, có nhiều hàng đợi sử dụng: hàng đợi máy in, việc truy xuất đĩa, sử dụng CPU chuyển đổi từ Infix sang Prefix Phần tử đầu hàng đợi phục vụ trước, phần tử thường gọi front hay head Phần tử thêm vào gọi rear hay tail @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (4/8) Định nghĩa: Một hàng đợi phần tử kiểu T chuỗi nối tiếp phần tử T kèm theo số tác vụ sau: Tạo đối tượng hàng rỗng Thêm phần tử vào hàng, giả sử hàng đợi chưa đầy (phần tử liệu thêm vào cuối hàng) Loại phần tử khỏi hàng, giả sử hàng chưa rỗng (phần tử bị loại phần tử đầu hàng, thường phần tử vừa xử lý xong) Xem phần tử đầu hàng (phần tử xử lý) @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (5/8) Hoạt động hàng đợi @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (3/8) Xây dựng Queue: Thành phần liệu cho Queue: MaxEntry: Kích thước Queue QueueEntry: Kiểu liệu dành cho phần tử Queue Một số phương thức Queue: QueueClassL(); int isEmpty(); int isFull(); int Dequeue(QueueEntry *value); int Enqueue(QueueEntry value); int Peek(QueueEntry *value); void makeEmpty(); @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (4/8) Khai báo lớp Queue (dạng tuyến tính): template // Lớp mẫu cho kiểu liệu Queue class QueueClassL{ // Định nghĩa tên lớp public: QueueClassL(); // Hàm tạo lớp, khởi tạo thông tin cho Queue int isEmpty(); // Queue rỗng → 1, ngược lại → int isFull(); // Queue đầy → 1, ngược lại → int Dequeue(QueueEntry *value); // Lấy phần tử Queue int Enqueue(QueueEntry value); // Thêm phần tử vào Queue int Peek(QueueEntry *value); // Xem giá trị đầu Queue void makeEmpty(); // Làm rỗng Queue private: int front, rear; // front: đầu Queue, rear: cuối Queue QueueEntry entry[MaxEntry]; // Mảng lưu thông tin Queue }; @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.1 Khái niệm hàng đợi (5/8) Một số phương thức Queue: template QueueClassL ::QueueClassL(void) { front=rear=-1; } 10 template int QueueClassL ::isEmpty() { if(front==rear) return 1; else return 0; } @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.2 Xây dựng sử dụng Queue (7/7) template template int QueueClassC::isFull() int QueueClassC::Enqueue(QueueEntry value) { if((rear+1)%MaxEntry== front) { if(!isFull()) { return 1; rear = (rear+1) % MaxEntry; else return 0; entry[rear]=value; return 1; } } else return 0; } template template int QueueClassC::Dequeue(QueueEntry *value) int QueueClassC::Peek(QueueEntry *value) { { if(!isEmpty()) { if(!isEmpty()) *value = entry[(front+1)%MaxEntry]; { return 1; } front = (front+1)%MaxEntry; *value = entry[front]; return 1; } template void QueueClassC::makeEmpty() { else return 0; } 20 else return 0; } front=rear=0; } @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.3 Ví dụ hàng đợi (1/5) Palindromes (1/4) Khái niệm: Một chuỗi gọi Palindrome đọc xi giống đọc ngược Bài tốn: Cho trước chuỗi, kiểm tra xem chuỗi có phải chuỗi palindrome hay khơng? Ví dụ chuỗi palindrome: Able was I ere I saw Elba Giải pháp: Để tránh ảnh hưởng tới chuỗi ban đầu, đọc chuỗi nói vào stack queue So sánh phần tử stack queue, giống cặp chuỗi Palindrome, ngược lại chuỗi khơng phải chuỗi Palindrome 21 @copyright by PhD Ngo Huu Phuc, Le Quy Don Technical University 13.3 Ví dụ hàng đợi (2/5) Kiểm tra chuỗi có phải chuỗi Palindrome hay khơng? int palindrome(char* sstring) { typedef char StackEntry; StackClass stack; typedef char QueueEntry; QueueClassC queue; #define MaxEntry 100 for(int i=0;i