Bài toán 8 hậu

1. Mô tả:

– Các yêu cầu của bài toán:
+ Không có đường chéo chính nào trên bàn cờ có 2 quân trở lên
+ Không có đường chéo phụ nào trên bàn cờ có 2 quân trở lên
+ Không có cột nào trên bàn cờ có 2 quân trở lên

Hình 1 – Trường hợp đúng trong bài toán 8 hậu:

Untitled

 

Hình 1

 – Về thuật toán thì các bạn có thể tìm thấy vô số trên các diễn đàn nên trong bài viết này tôi chỉ tập trung giải thích việc xác định đường chéo chính và đường chéo phụ của bài toán.

2. Cài đặt:

– Thuật toán khá đơn giản:

Untitled

 

3. Giải thích đường chéo chính:

Hình 2 – Mô tả chiều đường chéo chính

312px-Chessboard480.svg

Hình 2

Hình 3 – Chúng ta sẽ tìm cách xác định một đường chéo chính dựa vào chỉ số hàng i và chỉ số cột j. Trong hình, tất cả các ô nằm trong 1 đường chéo đều có tổng (i + j) bằng nhau:

312px-Chessboard480.svg

Hình 3

4. Giải thích đường chéo chính:

Hình 4 – Mô tả chiều đường chéo phụ

312px-Chessboard480.svg

Hình 4

Hình 5 – Chúng ta sẽ tìm cách xác định một đường chéo phụ dựa vào chỉ số hàng i và chỉ số cột j. Trong hình, tất cả các ô nằm trong 1 đường chéo phụ đều có biểu thức (i – j + 8) bằng nhau:

312px-Chessboard480.svg

Hình 5

Như vậy tôi đã giải thích vì sao lại dùng biểu thức (i + j) và (i – j + n) để xác định chéo chính và chéo phụ trong bài toán 8 hậu. Chúc các bạn thành công!

Thuật toán Kadane – Tìm tập hợp con có tổng lớn nhất

1. Giới thiệu:

–  Là thuật toán quy hoạch động có thể tìm ra tập hợp con có tổng lớn nhất từ tập hợp ban đầu một cách nhanh chóng, tốc độ thực hiện O(n).

– Chẳng hạn: A = {31, -41, 59, 26, -53, 58, 97, -93, -23, 84} , nên tập hợp con có tổng hợp nhất là {59, 26, -53, 58, 97}

2. Hiện thực:

Hình 1 – Khai báo tập hợp ban đầu

1

Hình 1

Hình 2 – Định nghĩa hàm tìm tổng lớn nhất

1

Hình 2

Hình 3 – Cải tiến hàm để tìm phần tử đầu tiên và bắt đầu của tập con

1

Hình 3

Như vậy là tôi vừa hướng dẫn bạn cài đặt thuật toán Kadane tìm tập hợp con có tổng lớn nhất với tốc độ nhanh nhất có thể. Chúc các bạn thành công!

Big Number – Các thao tác cộng trừ nhân chia số nguyên lớn

1. Giới thiệu:

– Trong một vài trường hợp, bạn cần lưu một số nguyên cực kỳ lớn.

– Chẳng hạn: 123.456.789.123.456.789.123.456.789.123.456.789.123.456.789.123.456.789

– Bạn có bao giờ thắc mắc có kiểu dữ liệu nào có thể đáp ứng được chuyện đó?

– Kiểu int chỉ có thể biểu diễn một số nguyên khoảng 2,1 tỉ. Ngoài ra, chúng ta còn có kiểu “unsigned long long int” với việc có biểu diễn một số có 18  ký số. Trong đó, từ khóa “unsigned” nhầm mục đích chỉ biểu diễn số dương. Nếu không có từ khóa “unsigned” thì vấn đề gì xảy ra, bạn tự tìm hiểu nhé!

– Trong bài này, tôi sẽ hướng dẫn các bạn thực hiện các phép tính cơ bản + – * / giữa 2 “số nguyên“. Nhưng “số nguyên” mà tôi muốn nói là số rất lớn, có số lượng ký số lên đến hàng chục, hàng ngàn và thậm chí là hàng tỉ ký số.

2. Hiện thực: 

– Để sử dụng lớp vector, bạn cần thư viện <vector> và khai báo using namespace std

Hình 1 – Khởi tạo và xem kết quả sau khi khởi tạo

1

Hình 1

Hình 2 – Hàm khởi tạo một số

1

Hình 2

Hình 3 – Hàm loại bỏ các số 0 ở đầu

1

Hình 3

Hình 4 – Hàm in số nguyên

1

Hình 4

 – Sau đó, các bạn thử khởi tạo 2 số và in ra màn hình nhé.

 – Bây giờ chúng ta sẽ bắt đầu vào thực hiện các phép tính + – * /

Hình 5 – Phép cộng

1

Hình 5

Hình 6 – Phép trừ

1

Hình 6

Hình 7 – Phép nhân

1

Hình 7

Hình 10 – Phép chia

 – Trong 4 phép toán thì phép chia là phép dài dòng và phức tạp nhất

 – Phép chia cần đến hàm so sánh và phép trừ

Hình 8 – Thực hiện phép chia thủ công

 – Chúng ta sẽ thực hiện việc chia 2 số như cách mà chúng ta đã biết từ khi học cấp 1

phep-chia-2-so-thap-phan-cho-nhau-buoc-7

Hình 8

Hình 9 – Phép so sánh

1

Hình 9

1

Hình 10

Như vậy là tôi vừa hướng dẫn các bạn thực hiện các phép tính cơ bản giữa các số nguyên cực lớn. Các bạn hãy thử cải tiến các thuật toán trên bằng cách mỗi phần tử của 1 vector có thể lưu 9 ký số chứ không phải là 1 ký số như tôi đã trình bày. Nếu được, hãy kiểm tra tính đúng đắn của thuật toán và liên hệ tôi để cùng nhau thảo luận vấn đề này nhé 🙂

Thuật toán Eratosthenes – Tối ưu thuật toán sàng số nguyên tố

1. Giới thiệu:

– Thuật toán Eratosthenes là thuật toán cổ xưa của người Hy Lạp để tìm một lượng số nguyên tố trong một phạm vi nhất định.

– Trong trường hợp muốn tìm tất cả các số nguyên tố trong một phạm vi lớn, việc sử dụng thuật toán sàng Eratosthenes sẽ mang lại hiệu quả cao về tốc độ thực hiện.

– Các bước của thuật toán sàng Eratosthenes:

+ Bước 1: Khởi tạo một tập hợp các số từ 2 đến N, trong đó N là phạm vi cần tìm

+ Bước 2: Từ 2, ta sẽ đánh dấu tất cả các bội của 2 và các bội này phải < N, những số được đánh dấu không phải là số nguyên tố. Sau khi đánh dấu hết tất cả các bội của 2, ta tiến hành đánh dấu bội của 3, 5 …. ta bỏ qua số 4 vì nó là bội của 2 và đã được đánh dấu.

+ Bước 3: Những số còn lại không được đánh dấu là số nguyên tố.

2. Cài đặt:

Sau đây, tôi sẽ trình bày phần hiện thực thuật toán.
Thông thường, chúng ta sẽ duyệt lại tập hợp sau khi đã sàng lọc.
Trong phần này, tôi sẽ tối ưu thuật toán bằng cách vừa sàng vừa hiển thị kết quả để tăng tốc độ thuật toán.

 Hình 1 – Khởi tạo và gọi hàm:

1

Hình 1

Hình 2 – Cài đặt thuật toán Eratosthenes:

1

Hình 2

Hình 3 – Đánh dấu các bội của một số nguyên tố:

1

Hình 3

Như vậy là tôi vừa hướng dẫn các bạn cài đặt và tối ưu thuật toán Eratosthenes.

Chúc các bạn thành công!

Thuật toán Kruskal – Tìm cây bao trùm nhỏ nhất

1. Mô tả:

– Giống như Prim, thuật toán Kruskal cũng tìm cây khung nhỏ nhất nhưng không phụ thuộc vào điểm bắt đầu.

Hình 1, đồ thị như sau:

400px-Đồ_thị_G_trong_lý_thuyết_đồ_thị

Hình 1

 – Bước 1: lập bảng, liệt kê tăng dần theo trọng số của các cạnh.

Untitled

Bước 2: dựa vào thứ tự bảng trên để đánh giá cạnh đó có thuộc cây khung tối tiểu hay không. Một cạnh thõa điều kiện khi nó không góp phần tạo thành một chu trình với tất cả các cạnh đã tìm được.

 1-4-1: Ta nhận thấy cạnh 1-4 không tạo ra một chu trình nào. Vì vậy, thêm 1-4 vào tập hợp

1

Hình 2

 6-7-1: Ta nhận thấy cạnh 6-7 không tạo ra một chu trình nào. Vì vậy, thêm 6-7 vào tập hợp

2

Hình 3

 4-6-2: Ta nhận thấy cạnh 4-6 không tạo ra một chu trình nào. Vì vậy, thêm 4-6 vào tập hợp

3

Hình 4

 1-2-3: Ta nhận thấy cạnh 1-2 không tạo ra một chu trình nào. Vì vậy, thêm 1-2 vào tập hợp

4

Hình 5

1-6-3: Ta nhận thấy cạnh 1-6 tạo ra một chu trình. Không thêm vào tập hợp.

5

Hình 6

 2-3-4: Ta nhận thấy cạnh 2-3 tạo ra một chu trình. Không thêm vào tập hợp.

6

Hình 7

3-7-5: Ta nhận thấy cạnh 3-7 tạo ra một chu trình. Không thêm vào tập hợp.

7

Hình 8

5-6-5: Ta nhận thấy cạnh 5-6 không tạo ra một chu trình nào. Vì vậy, thêm 5-6 vào tập hợp

8

Hình 9

CÂY BAO TRÙM THU ĐƯỢC, Hình 10:

9

Hình 10

Nguồn từ: http://vi.wikipedia.org/wiki/Thu%E1%BA%ADt_to%C3%A1n_Kruskal

2. Cài đặt:

Bước 1, khai báo các biến, ta sẽ không sử dụng ma trận kề để lưu đồ thị, mà sẽ sử dụng danh sách các cạnh đã khai báo để lưu từng cạnh, vì vậy khi nhập dữ liệu vào, ta cần gán dữ liệu vào danh sách các cạnh:

Untitled

Bước 2, cài đặt thuật toán Kruskal:

Untitled

 – Hàm thực hiện sắp xếp các cạnh tăng dần theo trọng số:

Untitled

 – Hàm tìm nút cha của một đỉnh:

Untitled – Hàm thực hiện việc kết nối 2 nút lại với nhau:

Untitled

Như vậy là mình vừa hướng dẫn các bạn thuật toán Kruskal – tìm cây khung nhỏ nhất, chúc các bạn cài đặt thành công ^_^

Thuật toán Prim – Tìm cây bao trùm nhỏ nhất

1. Mô tả:

Giống như Kruskal, Prim cũng tìm cây khung nhỏ nhất, tuy nhiên Prim phụ thuộc vào đỉnh xuất phát của quá trình tìm kiếm.

  Hình 1: Đây là đồ thị có trọng số ban đầu. Các số là các trọng số của các cạnh.

1

Hình 1

  Hình 2: Chọn một cách tùy ý đỉnh D là đỉnh bắt đầu. Các đỉnh A, B, EF đều được nối trực tiếp tới bằng cạnh của đồ thị. A là đỉnh gần D nhất nên ta chọn A là đỉnh thứ hai của cây và thêm cạnh AD vào cây.

 2

Hình 2

  Hình 3: Đỉnh được chọn tiếp theo là đỉnh gần D hoặc nhất. B có khoảng cách tới D bằng 9 và tới Abằng 7, E có khoảng cách tới cây hiện tại bằng 15, và F có khoảng cách bằng 6. F là đỉnh gần cây hiện tại nhất nên chọn đỉnh F và cạnh DF.

3

Hình 3

  Hình 4: Thuật toán tiếp tục tương tự như bước trước. Chọn đỉnh B có khoảng cách tới A bằng 7.

4

Hình 4

  Hình 5: Ở bước này ta chọn giữa C, E, và G. C có khoảng cách tới B bằng 8, E có khoảng cách tới B bằng 7, và G có khoảng cách tới F bằng 11. là đỉnh gần nhất, nên chọn đỉnh E và cạnh BE.

5

Hình 5

  Hình 6: Ở bước này ta chọn giữa CG. C có khoảng cách tới E bằng 5, và G có khoảng cách tới Ebằng 9. Chọn C và cạnh EC.

6

Hình 6

  Hình 7: Quá trình tìm đỉnh kế tiếp không được tạo ra một chu trình so với ban đầu, để biết được đỉnh mới được chọn có trở thành chu trình hay không, ta cần kiểm tra đỉnh đó đã được đi qua hay chưa, nếu đã đi qua thì không thể đi tới, trong trường hợp này là đỉnh B và đỉnh F đều có trọng số mới là 8 (nhỏ nhất) nhưng ta không chọn. Như vậy, đỉnh G là đỉnh còn lại duy nhất. Nó có khoảng cách tới F bằng 11, và khoảng cách tới E bằng 9. E ở gần hơn nên chọn đỉnh G và cạnh EG.

7

Hình 7

  Hình 8: Hiện giờ tất cả các đỉnh đã nằm trong cây và cây bao trùm nhỏ nhất được tô màu xanh lá cây. Tổng trọng số của cây là 39.

8

Hình 8

Nguồn từ: http://vi.wikipedia.org/wiki/Thu%E1%BA%ADt_to%C3%A1n_Prim

2. Cài đặt:

Bước 1: Khởi tạo các biến:

Untitled

Bước 2: Cài đặt các bước thực hiện trong thuật toán Prim:
UntitledHàm tìm nút kế tiếp:

Untitled

Như vậy là tôi vừa hướng dẫn các bạn cách cài đặt thuật toán Prim – tìm cây bao trùm nhỏ nhất, chúc các bạn thành công ^_^

Thuật toán DFS – Tìm kiếm theo chiều sâu

1. Mô tả:

– Đây là thuật toán tìm các đỉnh bằng cách duyệt theo chiều sâu.

– Xuất phát từ 1 đỉnh và đi mãi cho đến khi không thể đi tiếp, sau đó đi về lại đỉnh đầu.
Trong quá trình quay lại:

+ nếu gặp đường đi khác thì đi cho đến khi không đi tiếp được nữa

+ nếu không tìm ra đường đi nào khác thì ngừng việc tìm kiếm.

– Trong quá trình đi đến đỉnh khác, thuật toán sẽ lưu lại đỉnh cha vừa đi qua để khi đi ngược lại từ đỉnh Kết thúc đến đỉnh Xuất phát, ta có thể xem được đường đi từ đỉnh Kết thúc đến đỉnh Bắt Đầu (có thể số lần đi không ít nhất, các bạn có thể tham khảo thuật toán BFS).

– Sở dĩ thuật toán này tìm được đường đi là nhờ vào cơ chế tô màu và lưu đỉnh cha. Quá trình tô màu khiến 1 đỉnh không thể xét 2 lần trở lên và có thể xem được đường đi từ đỉnh Kết Thúc đến đỉnh Xuất phát dựa vào việc lưu đỉnh cha.

– Sau đây là minh họa về thuật toán:

+ Hình 1 đi từ đỉnh bắt đầu, đi cho đến khi không đi được nữa.

1

Hình 1

2

Hình 2

3

Hình 3

4

Hình 4

5

Hình 5

Hình 6 do không đi được nữa nên quay ngược về lại đỉnh bắt đầu.

6

Hình 6

7

Hình 7

Hình 8 khi quay lại đến đỉnh D, gặp đỉnh H vẫn chưa được tô màu, tìm được đường đi mới.

8

Hình 8

Hình 9 sau khi đi qua đỉnh H, không thể đi tiếp được nữa nên tiến hành quay lại đến đỉnh xuất phát.

9

Hình 9

2. Cài đặt:

1

Hình 10

 – Hình 11: khởi tạo các mảng và duyệt từng đỉnh theo chiều sâu

2

Hình 11

 – Hình 12: Visit là hàm duyệt theo chiều sâu, với tham số u là đỉnh sẽ duyệt

3

Hình 12

 – Hình 13: Xem kết quả

4

Hình 13

 Hình 14In đường đi từ đỉnh Xuất phát đến đỉnh kết thúc dựa vào mảng Back

5

Hình 14

Chúc các bạn thành công ^_^

Cài đặt Hash Table – Bảng băm

1. Mô tả:

– Bảng băm được sử dụng phổ biến và có rất nhiều tác dụng.

– Bạn có thể cài đặt bảng băm để làm một chương trình từ điển, mục đích của việc dùng bảng băm vào cài đặt từ điển là để cải thiện tốc độ tìm kiếm với số lượng từ vựng khổng lồ.

Hình 1 mô tả 1 bảng băm đơn giản.

HashTable

Hình 1

– Cho các số k: 8, 19, 5, 9, 10 , thực hiện chèn vào 1 bảng băm có m = 10 slot. Với công thức: slot = k % m. Ta được kết quả như Hình 2

HashTable

Hình 2

2. Cài đặt:

Hình 3 định nghĩa kiểu dữ liệu Cell, 1 cell tương đương với 1 phần tử trong bảng băm.

Untitled

Hình 3

– Hình 4 định nghĩa hàm khởi tạo, khai báo mảng 2 chiều để thể hiện bảng băm, với kiểu dữ liệu là Cell.

2

Hình 4

– Hình 5 định nghĩa hàm GetSlot trả về slot của k.

Untitled

Hình 5

– Hình 6 định nghĩa hàm khởi tạo của bảng băm.

Untitled

Hình 6

– Hình 7 định nghĩa hàm hủy của bảng băm.

Untitled

Hình 7

– Hình 8 định nghĩa phương thức chèn một phần tử vào bảng băm, để thưc hiện chèn phần tử vào bảng băm, ta thực hiện 2 bước sau:

 + Tìm slot thích hợp.

 + Chèn vào slot: có 2 trường hợp có thể xảy ra, đó là trường hợp là phần tử đầu tiên và không phải là phần tử đầu tiên.

Untitled

Hình 8

– Hình 9 định nghĩa phương thức tìm kiếm phần tử có tồn tại trong bảng băm hay không.

Untitled

Hình 9

– Hình 10 định nghĩa phương thức in tất cả phần tử của bảng băm theo từng slot.

Untitled

Hình 10

Tôi vừa trình bày xong mô tả khái niệm và cách cài đặt bảng băm, sau khi cài đặt thành công bẳng băm, các bạn có thể cài đặt 1 bảng băm nâng cao hơn nữa bằng cách viết 1 chương trình từ điển đơn giản. Chúc các bạn thành công! 

Thuật toán BFS – Tìm kiếm theo chiều rộng

1. Mô tả

– Đây là thuật toán tìm các đỉnh bằng cách duyệt theo chiều rộng.

– Xuất phát từ 1 đỉnh và đi tới các đỉnh kề nó, tiếp tục cho đến khi không còn đỉnh nào có thể đi.

– Trong quá trình đi đến đỉnh kề, tiến hành lưu lại đỉnh cha của đỉnh kề để khi đi ngược lại từ đỉnh Kết thúc đến đỉnh Xuất phát, ta có được đường đi ngắn nhất.

– Sở dĩ thuật toán này tìm được đường đi ngắn nhất là nhờ vào cơ chế tô màu và lưu đỉnh cha. Quá trình tô màu khiến 1 đỉnh không thể xét 2 lần trở lên và có thể xem được đường đi từ đỉnh Kết Thúc đến đỉnh Xuất phát dựa vào việc lưu đỉnh cha.

– Sau đây là minh họa về thuật toán:

+ Hình 1 : Xuất phát từ đỉnh 1Untitled

Hình 1

 + Hình 2 : Đi đến đỉnh 2, như vậy nút 1 là nút cha của nút 2

Untitled

Hình 2

 + Hình 3 : Đã đi hết tất cả các đỉnh kề của đỉnh 1, tiến hành bôi đen đỉnh 1

Untitled

Hình 3

 + Hình 4: Xuất phát từ đỉnh 2, chọn đỉnh 3, nút cha của đỉnh 3 là đỉnh 2

Untitled

Hình 4

 + Hình 5 : Xuất phát từ đỉnh 2, bôi đen đỉnh 4, nút cha của đỉnh 4 là đỉnh 2

Untitled

Hình 5

 + Hình 6 : Đã đi hết tất cả các đỉnh kề của đỉnh 2, tiến hành bôi đen đỉnh 2

Untitled

Hình 6

 + Hình 7 : Xuất phát tử đỉnh 3, đi đến đỉnh 7, như vậy đỉnh 3 là đỉnh cha của đỉnh 7

Untitled

Hình 7

 + Hình 8 : Xuất phát từ đỉnh 3, đi đến đỉnh 5, như vậy đỉnh 3 là đỉnh cha của đỉnh 5

Untitled

Hình 8

 + Hình 3 : Đã đi hết tất cả các đỉnh kề của đỉnh 3, tiến hành bôi đen đỉnh 3

Untitled

Hình 9

 + Hình 10 : Xuất phát từ đỉnh 5, đi đến đỉnh 6, như vậy đỉnh 5 là đỉnh cha của đỉnh 6

Untitled

Hình 10

 + Hình 11: Đã đi hết tất cả các đỉnh kề của đỉnh 5, tiến hành bôi đen đỉnh 5

Untitled

Hình 11

 + Hình 12: Đã đi hết tất cả các đỉnh kề của đỉnh 7, tiến hành bôi đen đỉnh 7

Untitled

Hình 12

 + Hình 13 : Đã đi hết tất cả các đỉnh kề của đỉnh6, tiến hành bôi đen đỉnh 6

Untitled

Hình 13

 – Như vậy ta vừa đi hết tất cả các đỉnh trong đồ thị, và mỗi lần đi đến đỉnh mới, ta đều lưu lại nút cha của đỉnh mới, dựa vào những đỉnh cha này, ta có liệt kê đường đi ngắn nhất bằng cách đi ngược từ đỉnh Kết thúc, đến đỉnh cha của đỉnh Kết thúc … rồi đến đỉnh cha của đỉnh tiếp theo … đến đỉnh Bắt đầu.

2. Cài đặt

Hình 14: Cài đặt thuật toán BFS

Untitled

Hình 14

 – Hình 15: In đường đi từ đỉnh Xuất phát đến đỉnh Kết thúc

Untitled

Hướng phát triển: trong bài này tôi đã không đề cập đến việc tính tổng số đỉnh phải đi từ đỉnh Xuất phát đến đỉnh Kết thúc, vì nó không quan trọng, các bạn có thể tìm hiểu thêm và tự cài đặt. Chúc các bạn thành công!

Cài đặt Queue – Hàng đợi

1. Mô tả:

– Hàng đợi là một cấu trúc dữ liệu dùng để chứa các đối tượng làm việc 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”. Trong cuộc sống, ta gặp rất nhiều sự kiện liên quan đến nguyên lý này, chẳng hạn quy trình khám bệnh, người bệnh nào đến trước thì được khám trước, người bệnh nào đến sau thì được khám sau.

– Các phương thức chính của hàng đợi Hình 1:

queue

Hình 1

 + Phương thức Enqueue(): Thêm một phần tử vào cuối hàng đợi
+ Phương thức Dequeue(): Lấy phần tử đầu ra khỏi hàng đợi
+ Phương thức Front(): Lấy thông tin phần tử đầu của hàng đợi

 – Các phương thức phụ:
+ Phương thức IsEmpty(): Kiểm tra hàng đợi rỗng
+ Phương thức IsFull(): Kiểm tra hàng đợi đầy

2. Cài đặt:

– Các phương thức của hàng đợi Hình 2:

Untitled

Hình 2

– Phương thức khởi tạo hàng đợi Hình 3:

Untitled

Hình 3

– Phương thức hủy hàng đợi hàng đợi Hình 4:

Untitled

Hình 4

– Phương thức kiểm tra hàng đợi rỗng Hình 5:

Untitled

Hình 5

– Phương thức kiểm tra hàng đợi đầy Hình 6:

Untitled

Hình 6

– Phương thức thêm phần tử vào cuối hàng đợi Hình 7:

Untitled

Hình 7

– Phương thức lấy phần tử đầu ra khỏi hàng đợi Hình 8:
+ Ở phương thức này, ta không thể chỉ đơn giản tăng biến first lên 1, vì ta sử dụng mảng tĩnh, mảng tĩnh quy định phần tử đầu tiên có chỉ số = 0, vì vậy nếu cứ tăng first lên 1 thì ta chỉ có thể sử dụng Queue 1 lần duy nhất.
+ Cách giải quyết ở đây là di chuyển các phần tử qua trái 1 lần, sau đó giảm biến last xuống 1 đơn vị.

Untitled

Hình 8

– Phương thức xem thông tin phần tử đầu hàng đợi Hình 9:

Untitled

Hình 9

3. Hướng phát triển:

 Các bạn có thể cài đặt thêm nhiều phương thức hỗ trợ khác để việc sử dụng hàng đợi thuật tiện hơn, sau khi cài đặt thành thạo, các bạn có thể thử cài đặt một hàng đợi động, không giới hạn kích thước. Chúc các bạn thành công!