Cài đặt hàng đợi bằng mảng

Một phần của tài liệu cau truc du lieu va giai thuat giaotrinh cuuduongthancong com (Trang 69 - 72)

Tƣơng tự nhƣ ngăn xếp, hàng đợi có thể đƣợc cài đặt bằng mảng hoặc danh sách liên kết. Đối với ngăn xếp, việc bổ sung và loại bỏ một phần tử đều đƣợc thực hiện ở đỉnh ngăn xếp, do vậy ta chỉ cần sử dụng 1 biến top để lƣu giữ để đỉnh này. Tuy nhiên, đối với hàng đợi việc bổ sung và loại bỏ

Đầu hàng Cuối hàng A Đầu hàng Cuối hàng A B C Đầu hàng Cuối hàng B C Đầu hàng Cuối hàng B C D Đầu hàng Cuối hàng C D Đầu hàng Cuối hàng D Đầu hàng Cuối hàng

phần tử đƣợc thực hiện ở 2 đầu khác nhau, do vậy ta cần sử dụng 2 biến là head và tail để lƣu giữ điểm đầu và điểm cuối của hàng đợi. Các phần tử thuộc hàng đợi là các phần tử nằm giữa điểm đầu và điểm cuối này.

Hình 4.3 Cài đặt hàng đợi bằng mảng

Để lấy ra 1 phần tử của hàng, điểm đầu tăng lên 1 và phần tử ở đầu hàng sẽ đƣợc lấy ra. Để bổ sung 1 phần tử vào hàng đợi, phần tử này sẽ đƣợc bổ sung vào cuối hàng và điểm cuối sẽ tăng lên 1.

Ta thấy rằng biến tail luôn tăng khi bổ sung phần tử và cũng không giảm khi loại bỏ phần tử. Do đó, sau 1 số hữu hạn thao tác, biến này sẽ tiến đến cuối mảng và cho dù phần đầu mảng có thể còn trống do một số phần tử của hàng đợi đã đƣợc lấy ra, ta vẫn không thể bổ sung thêm phần tử vào hàng đợi. Để giải quyết vấn đề này, ta sử dụng phƣơng pháp quay vòng. Khi biến tail tiến đến cuối mảng và phần đầu mảng còn trống thì ta sẽ cho biến này quay trở lại đầu mảng. Tƣơng tự vậy, ta cũng cho biến head quay lại đầu mảng khi nó tiến tới cuối mảng.

Khai báo bằng mảng cho 1 hàng đợi chứa các số nguyên với tối đa 100 phần tử nhƣ sau:

#define MAX 100 typedef struct {

int head, tail, count; int node[MAX];

} queue;

Trong khai báo này, để thuận tiện cho việc kiểm tra hàng đợi đầy hoặc rỗng, ta dùng thêm 1 biến count để cho biết số phần tử hiện tại của hàng đợi.

Khi đó, các thao tác trên hàng đợi đƣợc cài đặt nhƣ sau:

Thao tác h i tạo hàng đợi

Thao tác này thực hiện việc gán giá trị 0 cho biến head, giá trị MAX -1 cho biến tail, và giá trị 0 cho biến count, cho biết hàng đợi đang ở trạng thái rỗng.

void QueueInitialize(queue *q){ q-> head = 0; q-> tail = MAX-1; q-> count = 0; return; } head tail 0 max

Thao tác kiểm tra hàng đợi r ng

Hàng đợi rỗng nếu có số phần tử nhỏ hơn hoặc bằng 0.

int QueueEmpty(queue q){ return (q.count <= 0); }

Thao tác thêm 1 phần tử vào hàng đợi

void Put(queue *q, int x){ if (q-> count == MAX)

printf(“Hang doi day !”); else{ if (q->tail == MAX-1 ) q->tail=0; else (q->tail)++; q->node[q->tail]=x; q-> count++; } return; }

Để thêm phần tử vào cuối hàng đợi, điểm cuối tăng lên 1 (nếu điểm cuối đã ở vị trí cuối mảng thì quay vòng điểm cuối về 0). Trƣớc khi thêm phần tử vào hàng đợi, cần kiếm tra xem hàng đợi đã đầy chƣa (hàng đợi đầy khi giá trị biến count = MAX).

Lấy phần tử ra khỏi hàng đợi

Để lấy phần tử ra khỏi hàng đợi, tiến hành lấy phần tử tại vị trí điểm đầu và cho điểm đầu tăng lên 1 (nếu điểm đầu đã ở vị trí cuối mảng thì quay vòng điểm đầu về 0). Tuy nhiên, trƣớc khi làm các thao tác này, ta phải kiểm tra xem hàng đợi có rỗng hay không.

int Get(queue *q){ int x;

if (QueueEmpty(*q))

printf("Hang doi rong !"); else{ x = q-> node[q-> head]; if (q->head == MAX-1 ) q->head=0; else (q->head)++; q-> count--;

}

return x; }

Một phần của tài liệu cau truc du lieu va giai thuat giaotrinh cuuduongthancong com (Trang 69 - 72)

Tải bản đầy đủ (PDF)

(153 trang)