Professional Documents
Culture Documents
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.
- 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.
+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;
}
if (isFull()) {
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;
}
+ 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)