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

Một phần của tài liệu Bài giảng cấu trúc dữ liệu và giải thuật (2013) (Trang 71 - 73)

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ỏ 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 khở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;

head tail

66 q-> count = 0; return; } 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 Bài giảng cấu trúc dữ liệu và giải thuật (2013) (Trang 71 - 73)

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

(189 trang)