SlideShare a Scribd company logo
HDTH CTDL & KTLT nâng cao tuần 5
1. Queue là gì?
Queue là một cấu trúc dữ liệu:
- Dùng để lưu trữ nhiều phần tử dữ liệu.
- Hoạt động theo cơ chế “Vào trước – ra trước” (First In First Out – LIFO).
2. Các thao tác cơ bản trên Queue
Thao tác cơ bản trên Queue chỉ bao gồm:
- EnQueue: Thêm một phần tử vào cuối Queue, có thể làm Queue đầy.
- DeQueue: Lấy ra một phần tử ở đầu Queue, có thể làm Queue rỗng.
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 1
HDTH CTDL & KTLT nâng cao tuần 5
Ngoài 2 thao tác cơ bản trên, người ta còn xây dựng thêm các thao tác cơ bản khác
dùng để phụ trợ thêm cấu trúc Queue:
- InitQueue: dùng để khởi tạo Queue rỗng.
- IsEmpty: dùng để kiểm tra Queue có rỗng hay không?
- IsFull: dùng để kiểm tra Queue có đầy hay chưa?
- QueueFront: dùng để trả về phần tử đầu Queue mà không loại bỏ phần tử đó ra
khỏi Queue.
- QueueSize: dùng để cho biết số phần tử hiện đang có trong Queue.
3. Xây dựng Queue bằng mảng (chỉ mang tính chất tham
khảo)
3.1. Khai báo cấu trúc Queue bằng struct
// Giả sử Queue chứa các phần tử kiểu nguyên (int)
// Khai báo cấu trúc Queue
typedef struct queue {
int *QArray; // mảng chứa các phần tử
int Max; // số phần tử tối đa
int NumItems; // số phần tử hiện có
int Front; // vị trí đầu queue
int Rear; // vị trí cuối queue
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 2
HDTH CTDL & KTLT nâng cao tuần 5
};
typedef struct queue QUEUE;
3.2. Các hàm xử lý thao tác
int InitQueue(QUEUE &q, int MaxItems);
int IsEmpty(const QUEUE &q);
int IsFull(const QUEUE &q);
int EnQueue(QUEUE &q, int newitem);
int DeQueue(QUEUE &q, int &itemout);
int QueueFront(const QUEUE &q, int &itemout);
3.2.1. Hàm khởi tạo Queue
// khởi tạo Queue rỗng, có tối đa MaxItems phần tử
int InitQueue(QUERE &q, int MaxItems)
{
q.QArray = new int[MaxItems];
if (q.QArray==NULL)
return 0; // Không cấp phát được bộ nhớ
q.Max = MaxItems;
q.NumItems = 0; // chưa có phần tử nào trong Queue
q.Front = q.Rear = -1;
return 1; // khởi tạo thành công
}
3.2.2. Hàm kiểm tra Queue rỗng
// Hàm kiểm tra queue = rỗng ?
int IsEmpty(const QUEUE &q)
{
if (q.NumItems==0)
return 1; // Queue rỗng
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 3
HDTH CTDL & KTLT nâng cao tuần 5
return 0; // Queue không rỗng
}
3.2.3. Hàm kiểm tra Queue đầy
// Hàm kiểm tra queue đầy ?
int IsFull(const QUEUE &q)
{
if (q.NumItems==q.Max)
return 1; // Queue đầy
return 0; // Queue không đầy
}
3.2.4. Hàm thêm một phần tử vào cuối Queue
// Thao tác “EnQueue”: thêm 1 phần tử vào cuối Queue
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.QArray[q.Rear] = newitem; // thêm phần tử vào Queue
if (q.NumItems==0)
q.Front = 0;
q.NumItems++;
return 1; // Thêm thành công
}
3.2.5. Hàm lấy một phần tử ở đầu Queue
// Thao tác “DeQueue”: lấy ra 1 phần tử ở đầu Queue
int DeQueue(QUEUE &q, int &itemout)
{
if (IsEmpty(q))
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 4
HDTH CTDL & KTLT nâng cao tuần 5
return 0; // Queue rỗng, kết quả=FALSE
itemout = q.QArray[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; // Thêm thành công
}
3.2.6. Hàm lấy về một phần tử ở đầu Queue mà không xóa phần tử đó
// Thao tác “QueueFront”: kiểm tra phần tử ở đầu Queue
// *** không xoá phần tử
int QueueFront(const QUEUE &q, int &itemout)
{
if (IsEmpty(q))
return 0; // Queue rỗng, kết quả=FALSE
// lấy phần tử đầu ra
itemout = q.QArray[q.Front];
return 1;
}
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 5
HDTH CTDL & KTLT nâng cao tuần 5
4. Xây dựng Queue bằng danh sách liên kết đơn
Tương tự như phần xây dựng Queue bằng mảng ta cũng tiến hành như sau.
4.1. Khai báo cấu trúc Queue bằng struct
// Giả sử Queue chứa các phần tử kiểu phân số
4.2. Các hàm xử lý thao tác
void InitQueue(QUEUE &q);
int IsEmpty(const QUEUE &q);
int EnQueue(QUEUE &q, NODE* p);
int DeQueue(QUEUE &q, NODE* &p);
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 6
HDTH CTDL & KTLT nâng cao tuần 5
int QueueFront(QUEUE &q, NODE* &p);
4.2.1. Hàm khởi tạo Queue
4.2.2. Hàm kiểm tra Queue rỗng
4.2.3. Hàm thêm một phần tử vào cuối Queue
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 7
HDTH CTDL & KTLT nâng cao tuần 5
4.2.4. Hàm lấy một phần tử ở đầu Queue
4.2.5. Hàm lấy về một phần tử ở đầu Queue mà không xóa phần tử đó
4.3. Các hàm phụ trợ khác
4.3.1. Hàm nhập vào danh sách vào Queue
void input(QUEUE &q)
{
int n;
printf ("Nhap vao so luong node (phan so):");
scanf("%d",&n);
phanso x;
for(int i=1; i<=n;i++)
{
printf("Nhap vao tu so:");
scanf("%d",&x.tu);
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 8
HDTH CTDL & KTLT nâng cao tuần 5
printf("Nhap vao mau so:");
scanf("%d",&x.mau);
EnQueue(q,x); // đẩy phân số mới nhập vào Queue
}
}
4.3.3. Hàm xuất ra danh sách từ Queue
4.3.4. Hàm main
Bài Tập
Bài tập về Queue dùng danh sách liên kết đơn để quản lý nhân viên
1. Tạo cấu trúc nhân viên gồm tên, tuổi, lương.
2. Tạo cấu trúc node để lưu trữ mỗi node là một nhân viên tương ứng.
3. Tạo cấu trúc Queue.
4. Khởi tạo Queue rỗng (hàm InitQueue).
5. Viết hàm kiểm tra Queue có rỗng hay không? (IsEmpty).
6. Viết hàm nhập các thông tin nhân viên.
7. Viết hàm thêm một node nhân viên vào cuối Queue (EnQueue).
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 9
HDTH CTDL & KTLT nâng cao tuần 5
8. Viết hàm lấy một node nhân viên ở đầu Queue ra (DeQueue).
9. Viết hàm hàm lấy một node nhân viên ở đỉnh Queue ra mà không xóa node đó khỏi
Queue (QueueFront).
10. Viết nhập một danh sách thông tin nhân viên vào trong Queue.
11. Viết hàm hiển thị thông tin nhân viên trong Queue ra.
Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 10

More Related Content

PDF
02 stack queue
PPT
Val
PPT
Ctdl C05
PDF
Dhhh ctdlgt bai giang cau truc du lieu
PPT
Gioi Thieu
DOC
Bài tập CTDL và GT 11
PPT
Ctdl C11
PPT
Ctdl C08
02 stack queue
Val
Ctdl C05
Dhhh ctdlgt bai giang cau truc du lieu
Gioi Thieu
Bài tập CTDL và GT 11
Ctdl C11
Ctdl C08

Viewers also liked (20)

PPT
Ctdl C06
PPT
Ctdl C01
PPT
Ctdl C09
PDF
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
PPT
Ctdl C03
PPT
Ctdl C02
PPT
Ctdl C04
PPT
Ctdl C10
PDF
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
PPT
Ctdl+va+gt chuong+1 4
DOC
Bài tập CTDL và GT 3
PDF
Giaotrinhbaitapkythuatlaptrinh
PPT
Gt de quy
PDF
Bai giang-ctdl
PDF
Cấu truc-dữ-liệu-va-thuật-giải-1
PPT
Ctdl C07
PDF
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
PDF
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPT
PDF
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
PDF
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPT
Ctdl C06
Ctdl C01
Ctdl C09
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
Ctdl C03
Ctdl C02
Ctdl C04
Ctdl C10
Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
Ctdl+va+gt chuong+1 4
Bài tập CTDL và GT 3
Giaotrinhbaitapkythuatlaptrinh
Gt de quy
Bai giang-ctdl
Cấu truc-dữ-liệu-va-thuật-giải-1
Ctdl C07
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
Bài 4: ARRAY VÀ ARRAYLIST - Giáo trình FPT
Bài 1: Tổng quan về cấu trúc và giải thuật - Giáo trình FPT
Bài 2: Lập trình hướng đối tượng (OOP) - Giáo trình FPT
Ad

Similar to Ctdl ktlt tuan5 (20)

PPTX
CauTrucDuLieu_BaiGiang5_Stack_Queue.pptx
PPTX
Giao trinh Stack va Queue trong DSA.pptx
PDF
Bai10 stack queue
PDF
Baigiang ctdl
PPTX
Lecture 11 - Cau truc du lieu Queues.pptx
PPT
C3 stack queue
PDF
Cau truc dl_va_giai_thuat_bai1[1] - copy
PPTX
Stack &amp; queue
PDF
Rtos 4 queue vs interrupt
PDF
CTDL-04-Ngan xep va Hang doi (1).pdf
PDF
C6 stack queue
PPTX
Bai giang stack c++
PDF
w8-StackQueue.pdfgfgdgfffđfđgfgdgfgdfgdgdf
PDF
Cấu trúc dữ liệu cơ bản 2
PDF
Đề thi 02
PDF
Bai5 dsachlket
PPTX
Chuong 2 - Cac cau truc du lieu co ban.pptx
PDF
CHƯƠNG 3.pdf
PDF
Cơ sở dữ liệu và giải thuật Vũ Song Tùng
PDF
CauTrucDuLieu_BaiGiang5_Stack_Queue.pptx
Giao trinh Stack va Queue trong DSA.pptx
Bai10 stack queue
Baigiang ctdl
Lecture 11 - Cau truc du lieu Queues.pptx
C3 stack queue
Cau truc dl_va_giai_thuat_bai1[1] - copy
Stack &amp; queue
Rtos 4 queue vs interrupt
CTDL-04-Ngan xep va Hang doi (1).pdf
C6 stack queue
Bai giang stack c++
w8-StackQueue.pdfgfgdgfffđfđgfgdgfgdfgdgdf
Cấu trúc dữ liệu cơ bản 2
Đề thi 02
Bai5 dsachlket
Chuong 2 - Cac cau truc du lieu co ban.pptx
CHƯƠNG 3.pdf
Cơ sở dữ liệu và giải thuật Vũ Song Tùng
Ad

Recently uploaded (6)

PPTX
thi công cầu thuyết trình elearning 2.pptx
DOCX
Đệ Quy (Recursion) trong Java | Giải thích và Ứng dụng
DOCX
Truyền Giá Trị Và Tham Chiếu trong Java | Các Cách Truyền Dữ Liệu vào Phương ...
PPTX
bài thuyết trình thi công cầu elearning 3.pptx
PDF
Bài giảng - Phat Trien UD Tren Linux_Final_14092023.pdf
DOCX
GIẢI PHÁP BẢO MẬT THÔNG TIN LOGISTICS CHO DOANH NGHIỆP VIETTEL POST TRONG KỶ ...
thi công cầu thuyết trình elearning 2.pptx
Đệ Quy (Recursion) trong Java | Giải thích và Ứng dụng
Truyền Giá Trị Và Tham Chiếu trong Java | Các Cách Truyền Dữ Liệu vào Phương ...
bài thuyết trình thi công cầu elearning 3.pptx
Bài giảng - Phat Trien UD Tren Linux_Final_14092023.pdf
GIẢI PHÁP BẢO MẬT THÔNG TIN LOGISTICS CHO DOANH NGHIỆP VIETTEL POST TRONG KỶ ...

Ctdl ktlt tuan5

  • 1. HDTH CTDL & KTLT nâng cao tuần 5 1. Queue là gì? Queue là một cấu trúc dữ liệu: - Dùng để lưu trữ nhiều phần tử dữ liệu. - Hoạt động theo cơ chế “Vào trước – ra trước” (First In First Out – LIFO). 2. Các thao tác cơ bản trên Queue Thao tác cơ bản trên Queue chỉ bao gồm: - EnQueue: Thêm một phần tử vào cuối Queue, có thể làm Queue đầy. - DeQueue: Lấy ra một phần tử ở đầu Queue, có thể làm Queue rỗng. Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 1
  • 2. HDTH CTDL & KTLT nâng cao tuần 5 Ngoài 2 thao tác cơ bản trên, người ta còn xây dựng thêm các thao tác cơ bản khác dùng để phụ trợ thêm cấu trúc Queue: - InitQueue: dùng để khởi tạo Queue rỗng. - IsEmpty: dùng để kiểm tra Queue có rỗng hay không? - IsFull: dùng để kiểm tra Queue có đầy hay chưa? - QueueFront: dùng để trả về phần tử đầu Queue mà không loại bỏ phần tử đó ra khỏi Queue. - QueueSize: dùng để cho biết số phần tử hiện đang có trong Queue. 3. Xây dựng Queue bằng mảng (chỉ mang tính chất tham khảo) 3.1. Khai báo cấu trúc Queue bằng struct // Giả sử Queue chứa các phần tử kiểu nguyên (int) // Khai báo cấu trúc Queue typedef struct queue { int *QArray; // mảng chứa các phần tử int Max; // số phần tử tối đa int NumItems; // số phần tử hiện có int Front; // vị trí đầu queue int Rear; // vị trí cuối queue Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 2
  • 3. HDTH CTDL & KTLT nâng cao tuần 5 }; typedef struct queue QUEUE; 3.2. Các hàm xử lý thao tác int InitQueue(QUEUE &q, int MaxItems); int IsEmpty(const QUEUE &q); int IsFull(const QUEUE &q); int EnQueue(QUEUE &q, int newitem); int DeQueue(QUEUE &q, int &itemout); int QueueFront(const QUEUE &q, int &itemout); 3.2.1. Hàm khởi tạo Queue // khởi tạo Queue rỗng, có tối đa MaxItems phần tử int InitQueue(QUERE &q, int MaxItems) { q.QArray = new int[MaxItems]; if (q.QArray==NULL) return 0; // Không cấp phát được bộ nhớ q.Max = MaxItems; q.NumItems = 0; // chưa có phần tử nào trong Queue q.Front = q.Rear = -1; return 1; // khởi tạo thành công } 3.2.2. Hàm kiểm tra Queue rỗng // Hàm kiểm tra queue = rỗng ? int IsEmpty(const QUEUE &q) { if (q.NumItems==0) return 1; // Queue rỗng Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 3
  • 4. HDTH CTDL & KTLT nâng cao tuần 5 return 0; // Queue không rỗng } 3.2.3. Hàm kiểm tra Queue đầy // Hàm kiểm tra queue đầy ? int IsFull(const QUEUE &q) { if (q.NumItems==q.Max) return 1; // Queue đầy return 0; // Queue không đầy } 3.2.4. Hàm thêm một phần tử vào cuối Queue // Thao tác “EnQueue”: thêm 1 phần tử vào cuối Queue 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.QArray[q.Rear] = newitem; // thêm phần tử vào Queue if (q.NumItems==0) q.Front = 0; q.NumItems++; return 1; // Thêm thành công } 3.2.5. Hàm lấy một phần tử ở đầu Queue // Thao tác “DeQueue”: lấy ra 1 phần tử ở đầu Queue int DeQueue(QUEUE &q, int &itemout) { if (IsEmpty(q)) Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 4
  • 5. HDTH CTDL & KTLT nâng cao tuần 5 return 0; // Queue rỗng, kết quả=FALSE itemout = q.QArray[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; // Thêm thành công } 3.2.6. Hàm lấy về một phần tử ở đầu Queue mà không xóa phần tử đó // Thao tác “QueueFront”: kiểm tra phần tử ở đầu Queue // *** không xoá phần tử int QueueFront(const QUEUE &q, int &itemout) { if (IsEmpty(q)) return 0; // Queue rỗng, kết quả=FALSE // lấy phần tử đầu ra itemout = q.QArray[q.Front]; return 1; } Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 5
  • 6. HDTH CTDL & KTLT nâng cao tuần 5 4. Xây dựng Queue bằng danh sách liên kết đơn Tương tự như phần xây dựng Queue bằng mảng ta cũng tiến hành như sau. 4.1. Khai báo cấu trúc Queue bằng struct // Giả sử Queue chứa các phần tử kiểu phân số 4.2. Các hàm xử lý thao tác void InitQueue(QUEUE &q); int IsEmpty(const QUEUE &q); int EnQueue(QUEUE &q, NODE* p); int DeQueue(QUEUE &q, NODE* &p); Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 6
  • 7. HDTH CTDL & KTLT nâng cao tuần 5 int QueueFront(QUEUE &q, NODE* &p); 4.2.1. Hàm khởi tạo Queue 4.2.2. Hàm kiểm tra Queue rỗng 4.2.3. Hàm thêm một phần tử vào cuối Queue Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 7
  • 8. HDTH CTDL & KTLT nâng cao tuần 5 4.2.4. Hàm lấy một phần tử ở đầu Queue 4.2.5. Hàm lấy về một phần tử ở đầu Queue mà không xóa phần tử đó 4.3. Các hàm phụ trợ khác 4.3.1. Hàm nhập vào danh sách vào Queue void input(QUEUE &q) { int n; printf ("Nhap vao so luong node (phan so):"); scanf("%d",&n); phanso x; for(int i=1; i<=n;i++) { printf("Nhap vao tu so:"); scanf("%d",&x.tu); Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 8
  • 9. HDTH CTDL & KTLT nâng cao tuần 5 printf("Nhap vao mau so:"); scanf("%d",&x.mau); EnQueue(q,x); // đẩy phân số mới nhập vào Queue } } 4.3.3. Hàm xuất ra danh sách từ Queue 4.3.4. Hàm main Bài Tập Bài tập về Queue dùng danh sách liên kết đơn để quản lý nhân viên 1. Tạo cấu trúc nhân viên gồm tên, tuổi, lương. 2. Tạo cấu trúc node để lưu trữ mỗi node là một nhân viên tương ứng. 3. Tạo cấu trúc Queue. 4. Khởi tạo Queue rỗng (hàm InitQueue). 5. Viết hàm kiểm tra Queue có rỗng hay không? (IsEmpty). 6. Viết hàm nhập các thông tin nhân viên. 7. Viết hàm thêm một node nhân viên vào cuối Queue (EnQueue). Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 9
  • 10. HDTH CTDL & KTLT nâng cao tuần 5 8. Viết hàm lấy một node nhân viên ở đầu Queue ra (DeQueue). 9. Viết hàm hàm lấy một node nhân viên ở đỉnh Queue ra mà không xóa node đó khỏi Queue (QueueFront). 10. Viết nhập một danh sách thông tin nhân viên vào trong Queue. 11. Viết hàm hiển thị thông tin nhân viên trong Queue ra. Nguyễn Kim Hưng – Đoàn Chánh Thức – Khoa CNTT 10