Hàng đợi• Cấu trúc dữ liệu hoạt động theo cơ chế first-in first-out FIFO • Hai thao tác cơ bản: – Chèn vào hàng đợi: enqueue – Lấy ra khỏi hàng đợi: dequeue • Các đối tượng trong hàng đ
Trang 1Hàng đợi
• Cấu trúc dữ liệu hoạt động theo cơ chế first-in
first-out (FIFO)
• Hai thao tác cơ bản:
– Chèn vào hàng đợi: enqueue
– Lấy ra khỏi hàng đợi: dequeue
• Các đối tượng trong hàng đợi được sắp thứ tự theo thời gian chúng được chèn vào hàng
• Đối tượng được lấy ra khỏi hàng đợi là đối
tượng được chèn vào trước nhất
Trang 2Hàng đợi
head of queue tail of queue
enqueue dequeue
Trang 3Hàng đợi, sử dụng mảngKhai báo cấu trúc hàng đợi
Typerdef struct Queue
Trang 4Hàng đợi, sử dụng mảng
Thao tác khởi tạo hàng đợi rỗng
int InitQueue(Queue &q, int maxItems)
Trang 5Hàng đợi, sử dụng mảng
Thao tác kiểm tra hàng đợi rỗng
int IsEmpty(const Queue q)
Trang 6Hàng đợi, sử dụng mảng
Thao tác kiểm tra hàng đợi đầy
int IsFull(const Queue q)
{
if(q numItems == q.max)
return 1; // Queue đầy
return 0; // Queue không đầy
}
Trang 8Trừu tượng mảng
Trang 9Trừu tượng mảng
Trang 10Giải pháp
• Trở lại đầu dãy:
• Yêu cầu:
– front chỉ số đầu hàng đợi
– rear chỉ số cuối hàng đợi
– numItems biến đếm
– array_size chiều dài mảng
enqueue( 10 )
Trang 11Hàng đợi, sử dụng mảng
int EnQueue(Queue &q, int newItem)
{
if (IsFull(q)) return 0; // Queue đầy, không thêm vào được
q.rear++;
if(q.rear == q.max) // tràn giá
q.rear = 0; // quay trở về đầu mảng
q.arrQueue[q.rear] = newItem; // thêm phần tử vào cuối Queue
if(q.numItems == 0) q.front = 0;
q.numItems++;
return 1; // thêm thành công
}
Trang 12Hàng đợi, sử dụng mảng
int DeQueue(Queue &q, int &itemout)
{
if (IsEmpty(q)) return 0; // Queue rỗng, không lấy ra được
itemout = q.arrQueue[q.front]; // lấy phần tử đầu ra
q.front++;
q.numItems ;
if(q.front == q.max) // nếu đi hết mảng …
q.front = 0; // … quay trở về đầu mảng
if(q.numItems == 0) q.front = q.rear = -1;
return 1; // xóa thành công
}
Trang 15• Kiểu Client-server :
– Một hoặc nhiều clients đang yêu cầu được phục vụ từ một hay nhiều servers
– Có thể có nhiều hơn một client đang đợi để được
phục vụ tại cùng thời điểm
– Các clients trong hàng đợi sẽ được phục vụ theo theo thứ tự thời gian chúng được chèn vào
Trang 20• chèn tất cả con của nó vào hàng đợi
– Trật tự của các phần tử được lấy ra khỏi hàng đợi gọi
là trật tự breadth-first
Trang 21• Đưa nút gốc A vào
Trang 22• Lấy A ra và đưa hai con của nó là B và H vào
Trang 23• Lấy B ra và chèn C, D, và G
Trang 24• Lấy H ra và đưa I là con của nó vào
Trang 25• Lấy C ra – C không có con
Trang 26• Lấy D ra và đưa E và F vào
Trang 27• Lấy G
Trang 28• Lấy I và chèn vào J và K
Trang 29• Lấy E
Trang 30• Lấy F
Trang 31• Lấy J
Trang 32• Lấy K, và khi đó hàng đợi rỗng
Trang 33• Kết thúc ta có trật tự
A B H C D G I E F J K
là trật tự breadth first: