http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Cấu trúc liệu hàng đợi (Queue) Cấu trúc liệu hàng đợi (Queue) ? Hàng đợi (Queue) cấu trúc liệu trừu tượng, tương tự hàng đợi đời sống hàng ngày (xếp hàng) Khác với ngăn xếp, hàng đợi mở hai đầu Một đầu luôn sử dụng để chèn liệu vào (hay gọi vào hàng) đầu sử dụng để xóa liệu (rời hàng) Cấu trúc liệu hàng đợi tuân theo phương pháp First-In-First-Out, tức liệu nhập vào truy cập Trong đời sống thực có nhiều ví dụ hàng đợi, chẳng hạn hàng xe ô tô đường chiều (đặc biệt tắc xe), xe vào Một vài ví dụ khác xếp hàng học sinh, xếp hàng mua vé, … Biểu diễn cấu trúc liệu hàng đợi (Queue) Giờ có lẽ bạn tưởng tượng hàng đợi Chúng ta truy cập hai đầu hàng đợi Dưới biểu diễn hàng đợi dạng cấu trúc liệu: http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Tương tự cấu trúc liệu ngăn xếp, cấu trúc liệu hàng đợi triển khai sử dụng Mảng (Array), Danh sách liên kết (Linked List), Con trỏ (Pointer) Cấu trúc (Struct) Để đơn giản, phần tìm hiểu tiếp hàng đợi triển khai sử dụng mảng chiều Các hoạt động cấu trúc liệu hàng đợi Các hoạt động cấu trúc liệu hàng đợi liên quan tới việc khởi tạo hàng đợi, sử dụng liệu hàng đợi sau xóa liệu khỏi nhớ Danh sách số hoạt động thực cấu trúc liệu hàng đợi: • Hoạt động enqueue(): thêm (hay lưu trữ) phần tử vào hàng đợi • Hoạt động dequeue(): xóa phần tử từ hàng đợi Để sử dụng hàng đợi cách hiệu quả, cần kiểm tra trạng thái hàng đợi Để phục vụ cho mục đích này, số tính hỗ trợ khác hàng đợi: • Phương thức peek(): lấy phần tử đầu hàng đợi, mà khơng xóa phần tử • Phương thức isFull(): kiểm tra xem hàng đợi đầy hay khơng • Phương thức isEmpty(): kiểm tra xem hàng đợi trống hay hay không Trong cấu trúc liệu hàng đợi, luôn: (1) dequeue (xóa) liệu trỏ trỏ front (2) enqueue (nhập) liệu vào hàng đợi giúp đỡ trỏrear Trong phần tiếp tìm hiểu tính hỗ trợ cấu trúc liệu hàng đợi: http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Phương thức peek() cấu trúc liệu hàng đợi Giống cấu trúc liệu ngăn xếp, hàm giúp quan sát liệu đầu hàng đợi Giải thuật hàm peek() là: bắt đầu hàm peek return queue[front] kết thúc hàm Sự triển khai hàm peek() ngôn ngữ C: int peek() { return queue[front]; } Phương thức isFull() cấu trúc liệu hàng đợi Nếu sử dụng mảng chiều để triển khai hàng đợi, cần kiểm tra trỏ rear có tiến đến giá trị MAXSIZE hay không để xác định hàng đợi đầy hay không Trong trường hợp triển khai hàng đợi sử dụng Danh sách liên kết vòng (Circular Linked List), giải thuật cho hàm isFull() khác Phần giải thuật hàm isFull(): bắt đầu hàm isfull return false endif if rear equals to MAXSIZE kết thúc hàm return true else Sự triển khai giải thuật hàm isFull() ngôn ngữ C: bool isfull() { return false; } if(rear == MAXSIZE - 1) return true; else Phương thức isEmpty() cấu trúc liệu hàng đợi Giải thuật hàm isEmpty(): bắt đầu hàm isempty return true else if front nhỏ MIN OR front lớn rear return false kết thúc if kết thúc hàm Nếu giá trị front nhỏ MIN tức hàng đợi chưa khởi tạo, hàng đợi trống Dưới triển khai code ngôn ngữ C: bool isempty() { return false; } if(front < || front > rear) return true; else http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Hoạt động enqueue cấu trúc liệu hàng đợi Bởi cấu trúc liệu hàng đợi trì hai trỏ liệu: front rear, hoạt động loại cấu trúc liệu phức tạp so sánh với cấu trúc liệu ngăn xếp Dưới bước để enqueue (chèn) liệu vào hàng đợi: • Bước 1: kiểm tra xem hàng đợi có đầy khơng • Bước 2: hàng đợi đầy, tiến trình bị lỗi bị • Bước 3: hàng đợi không đầy, tăng trỏ rear để trỏ tới vị trí nhớ trống • Bước 4: thêm phần tử liệu vào vị trí trỏ rear trỏ tới hàng đợi • Bước 5: trả success Đơi cần kiểm tra xem hàng đợi khởi tạo hay chưa để xử lý tình không mong đợi http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Giải thuật cho hoạt động enqueue cấu trúc liệu hàng đợi bắt đầu enqueue(data) rear ← rear + if queue đầy queue[rear] ← data return overflow endif return true kết thúc hàm Sự triển khai giải thuật hoạt động enqueue() ngôn ngữ C: int enqueue(int data) + 1; queue[rear] = data; if(isfull()) return 0; return 1; kết thúc hàm rear = rear Để theo dõi triển khai code đầy đủ hoạt động ngôn ngữ C, mời bạn click chuột vào chương: Hàng đợi C Hoạt động dequeue cấu trúc liệu hàng đợi Việc truy cập liệu từ hàng đợi tiến trình gồm hai tác vụ: truy cập liệu nơi trỏ front trỏ tới xóa liệu sau truy cập Dưới bước để thực hoạt động dequeue: • Bước 1: kiểm tra xem hàng đợi trống hay khơng • Bước 2: hàng đợi trống, tiến trình bị lỗi bị • Bước 3: hàng đợi không trống, truy cập liệu nơi trỏ front trỏ • Bước 4: tăng trỏ front để trỏ tới vị trí chứa phần tử • Bước 5: trả success http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Giải thuật cho hoạt động dequeue bắt đầu hàm dequeue data = queue[front] if queue trống front ← front + return underflow end if return true kết thúc hàm Sự triển khai hoạt động dequeue() ngôn ngữ C: int dequeue() { front = front + 1; if(isempty()) return data; } return 0; int data = queue[front]; Để theo dõi triển khai code đầy đủ hoạt động ngôn ngữ C, mời bạn click chuột vào chương: Hàng đợi C http://vietjack.com/ Trang chia sẻ các bài học online miễn phí ...http://vietjack.com /cau- truc- du- lieu- ‐va-‐giai-‐thuat/index.jsp ... Trang chia sẻ các bài học online miễn phí http://vietjack.com /cau- truc- du- lieu- ‐va-‐giai-‐thuat/index.jsp ... Trang chia sẻ các bài học online miễn phí http://vietjack.com /cau- truc- du- lieu- ‐va-‐giai-‐thuat/index.jsp