You are on page 1of 6

I.

KHÁI NIỆM QUEUE


1. Khái niệm
Queue - Hàng đợi là một cấu trúc dữ liệu dùng để lưu giữ các đối tượng
theo cơ chế FIFO (viết tắt từ tiếng Anh: First In First Out), nghĩa là “vào
trước ra trước”.
Ví dụ: Trong đời sống thực chúng ta có rất nhiều ví dụ về hàng đợi, chẳng
hạn như hàng xe ô tô trên đường một chiều (đặc biệt là khi tắc xe), trong
đó xe nào vào đầu tiên sẽ thoát ra đầu tiên. Một vài ví dụ khác là xếp hàng
học sinh, xếp hàng mua vé, …

2. Đặc điểm
- Khác với ngăn xếp, hàng đợi là mở ở cả hai đầu.
- Cấu trúc dữ liệu hàng đợi tuân theo phương pháp First-In-First-Out, tức
là dữ liệu được nhập vào đầu tiên sẽ được truy cập đầu tiên.
- Chỉ có thể thêm các phần tử vào một đầu của queue.
- Chỉ có thể xóa phần tử ở đầu còn lại của queue.
- Ở một đầu không thể xảy ra hai hành động thêm và xóa đồng thời.

3. Các hàm phổ biến trong queue


- Q = init(); là khởi tạo Q là hàng đợi rỗng.
- isEmpty(Q); là trả lại "true" khi và chỉ khi hàng đợi Q là rỗng.
- isFull(Q); là trả lại "true" khi và chỉ khi hàng đợi Q là tràn.
- front(Q); là trả lại phần tử ở phía trước (front) của hàng đợi Q.
- enqueue(Q,x); là chèn phần tử x vào phía sau (back) hàng đợi Q.
- dequeue(Q,x); là xoá phần tử ở phía trước hàng đợi, trả lại x là
thông tin chứa trong phần tử này.
- print(Q); là đưa ra danh sách tất cả các phần tử của hàng đợi Q
theo thứ tự từ phía trước đến phía sau.
- size(Q); là trả lại số lượng phần tử trong hàng đợi Q.
II.CÀI ĐẶT QUEUE BẰNG MẢNG
- Dùng một mảng a[n] để chứa n phần tử của queue

- Gọi front là chỉ số của phần tử đầu tiên, rear là chỉ số của phần tử
cuối. ban đầu front = -1 và rear = -1. Bởi vì hàng đợi thêm cuối lấy ra
ở đầu => thêm 1 phần tử thì rear++, xóa 1 phần tử thì front++

- Như vậy queue có khuynh hướng đi xuống, đến một lúc nào đó ta
không thể thêm vào queue được nữa (rear=maxlength-1) dù mảng
còn nhiều chỗ trống (các vị trí trước front): queue bị tràn (xem
hình).Trong trường hợp toàn bộ mảng đã chứa các phần tử của
queue ta gọi là queue bị đầy.

- Cách khắc phục hàng bị tràn:


+ di chuyển tịnh tiến: Dời queue lên front-1 vị trí

+Dùng queue vòng tròn: coi mảng là một vòng tròn. khi queue bị tràn
nhưng chưa đầy => thêm phần tử mới vào vị trí 1 của mảng, thêm
một phần tử mới nữa thì thêm vào vị trí 2 (nếu có thể)… đến vị trí thứ
front-1
III.THÊM, XOÁ, SỬA PHẦN TỬ TRONG QUEUE
Phụ thuộc vào cách xử lý tràn queue mà các thao tác thêm, xóa,
sửa có sự khác nhau
1. VỚI QUEUE TỊNH TIẾN
- Thêm:
+ cách làm:
-kiểm tra queue có đầy không? Đầy thì không thêm

bool isFull() {
return (size==maxSize) ? true : false;
}

- gán a[rear+1]= vall, tăng rear, size lên 1 đơn vị

( nếu rear < maxSize)

+ code minh họa:


void enqueue(int item) {

if (isFull()) {

cout << "queue is Full" << endl;

return;}

size++;

rear++;

queue[rear] = item;

}
- Sửa
- + cách làm: :
- -sửa phần tử trong queue cũng giống như sửa phần tử của 1 mảng.
ta chỉ cần biết thứ tự của phần tử cần sửa (index ) và giá trị mới cần
thay thế (val ).
- -Vị trí k của giá trị thứ index trong mảng được tính bằng công thức
k=front+index-1
-
- + code minh họa:
void edit(int index,int val){
queue[front+index-1] = val;
}

- Xoá
+ cách làm:
-kiểm tra hàng rỗng không? Nếu rỗng thì không xóa
bool isEmpty() {
return (size==0) ? true : false?
}
-Khi xoá 1 phần tử đầu hàng ta front++,size--;
-Nếu front bằng rear thì hàng thực chất là hàng chỉ có 1 phần tử nên
ta khởi tạo lại bằng rỗng.(tức là đặt lại giá trị front=rear=-1, cho
size=0)
+ code minh họa:
int dequeue() {
if (isEmpty()) {
cout << "queue is Empty" << endl;
return -1;
}

int tmp = queue[front];


if(front == rear)
{
Front = rear = -1
Size=0;}
Else
{
front++;
size--; }
return tmp;
}

2. VỚI QUEUE DẠNG VÒNG


- Thêm
Khi thêm một phần tử vào queue thì có thể xảy ra các trường hợp
sau:
+ Trường hợp queue đầy thì báo lỗi và không thêm
+ Ngược lại, thay đổi giá trị của rear (Nếu rear =maxlength-1 thì đặt
lại rear=0; Ngược lại rear = rear+1) và đặt nội dung vào vị trí a[rear]
mới
- Sửa
Gọi vị trí của phần tử cần sửa trong mảng là k = front+i-1
+ Nếu k<n thì vị trí cần thay thế là k
+ Nếu k>n thì k=k-n
- Xóa
Khi xóa một phần tử ra khỏi queue, ta xóa tại vị trí đầu queue và có
thể xảy ra các trường hợp sau:
+ Nếu queue rỗng thì báo lỗi không xóa;
+ Ngược lại, nếu queue chỉ còn 1 phần tử thì khởi tạo lại queue rỗng;

+ Ngược lại, thay đổi giá trị của front. (Nếu front != Maxlength-1 thì
đặt lại front = front +1; Ngược lại front=0)

You might also like