Hàng đợi là một cấu trúc dữ liệu gần giống với ngăn xếp, nhưng khác với ngăn xếp ở nguyên tắc chọn phần tử cần lấy ra khỏi tập phần tử. Trái ngược với ngăn xếp, phần tử được lấy ra khỏi hàng đợi không phải là phần tử mới nhất được đưa vào mà là phần tử đã được lưu trong hàng đợi lâu nhất.
Điều này nghe có vẻ hợp với quy luật thực tế hơn là ngăn xếp ! Quy luật này của hàng đợi còn được gọi là Vào trước ra trước (FIFO - First In First Out). Ví dụ về hàng đợi có rất nhiều trong thực tế. Một dòng người xếp hàng chờ cắt tóc ở 1 tiệm hớt tóc, chờ vào rạp chiếu phim, hay siêu thị là
- *
- *
64
nhưng ví dụ về hàng đợi. Trong lĩnh vực máy tính cũng có rất nhiều ví dụ vềhàng đợi. Một tập các tác vụ chờ phục vụ bởi hệ điều hành máy tính cũng tuân theo nguyên tắc hàng đợi.
Hàng đợi còn khác với ngăn xếp ở chỗ: phần tử mới được đưa vào hàng đợi sẽ nằm ở phía cuối hàng, trong khi phần tử mới đưa vào ngăn xếp lại nằm ở đỉnh ngăn xếp.
Như vậy, ta có thể định nghĩa hàng đợi là một dạng đặc biệt của danh sách mà việc lấy ra một phần tử, get, được thực hiện ở 1 đầu (gọi là đầu hàng), còn việc bổ sung 1 phần tử, put, được thực hiện ở đầu còn lại (gọi là cuối hàng).
Trở lại với ví dụ về việc bổ sung và loại bỏ các phần tử của 1 ngăn xếp các ký tự nhưở phần trước, ta sẽ xem xét việc bổ sung và loại bỏ tương tự nhưng áp dụng cho hàng đợi các ký tự.
Giả sử ta có hàng đợi Q lưu trữ các ký tự. Ban đầu Q ở trạng thái rỗng:
Khi thực hiện lệnh bổ sung phần tử A, put(Q, A), hàng đợi có dạng:
Tiếp theo là các lệnh put(Q, B), put(Q, C):
Khi thực hiện lệnh get để lấy ra 1 phần tử từ hàng đợi thì phần tử được lưu trữ lâu nhất trong hàng sẽ được lấy ra. Đó là phần tử đầu tiên ở đầu hàng.
Tiếp theo, thực hiện lệnh put(Q, D) để bổ sung phần tử D. Phần tử này sẽ được bổ sung ở phía cuối của hàng.
Hai lệnh get tiếp theo sẽ lần lượt lấy ra 2 phần tử ở đầu hàng là B và C.
Đầu hàng Cuối hàng A Đầu hàng Cuối hàng A B C Đầu hàng Cuối hàng B C Đầu hàng Cuối hàng B C D Đầu hàng Cuối hàng C D Đầu hàng Cuối hàng D Đầu hàng Cuối hàng