Tải bản đầy đủ (.pdf) (24 trang)

Báo cáo thực hành trạm thu phí dùng queue

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (698.28 KB, 24 trang )

Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

TRƯỜNG ĐẠI HỌC SÀI GỊN
-------o0o-------

Báo Cáo Đồ Án Mơn Học
Cấu Trúc Dữ Liệu và Giải Thuật
Khoa Công Nghệ Thông Tin

1


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

Trường Đại Học Sài Gịn
-------o0o-------

Trạm Thu Phí

Báo Cáo Đồ Án
Ngành Cơng Nghệ Thơng Tin

Họ và tên: Nguyễn Thành Hưng
Lớp: DCT1211
MSSV: 3121410241
Học Phần: Cấu trúc dữ liệu và
giải thuật


Năm hoc: 2022/ HK: 2
Giảng Viên: PGS.TS Nguyễn
Tuấn Đăng

2


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

Mục Lục
1. Đề bài: ....................................................................................................................... 5
A. Đề bài: .......................................................................................................5
B. Các yêu cầu cần được giải quyết của đề bài: ............................................ 5
2. Mô tả hệ thống sẽ được xây dựng: .............................................................................5
2.1.Xác định các đối tượng trong hệ thống và các hàm khởi tạo các đối tượng đó: 5
2.2.Các chức năng của hệ thống: .......................................................................... 9
3.Giải thích lý do sử dụng các cấu trúc dữ liệu để mơ hình hóa các đối tượng dữ liệu trong hệ
thống: ............................................................................................................................. 9
3.1.Dùng hàng đợi để mơ hình hóa trạm thu phí: ................................................. 9
3.2.Dùng danh sách liên kết để biểu diễn thơng tin xe trong trạm: .......................9
4.Giải thích cài đặt các cấu trúc dữ liệu: .................................................................... 10
4.1.Cấu trúc dữ liệu danh sách liên kết ............................................................... 10
A. Định nghĩa: ..............................................................................................10
B. Cấu trúc dữ liệu của phần tử: .................................................................. 10
4.1.Cấu trúc dữ liệu hàng đợi: .............................................................................11
A. Định nghĩa: ..............................................................................................11
B. Cài đặt hàng đợi bởi danh sách liên kết: ................................................. 12
C. Cấu trúc dữ liệu của hàng đợi: ................................................................ 12

5. Mã giả trình bày các thuật tốn thực hiện các chức năng chính của chương trình:13
5.1.Chức năng thêm xe vào cuối hàng đợi: ......................................................... 13
5.2.Chức năng lấy xe ra ở đầu hàng đợi: ............................................................ 13
5.3.Hiển thị thông tin trong hàng đợi: .................................................................14
6. Trình bày và giải thích chương trinh được viết đề cài đặt các thuật tốn: ............. 14
6.1. Các chương trình khởi tạo: ...........................................................................14
A. Khởi tạo danh sách liên kết: ....................................................................14
B. Khởi tạo hàng đợi rỗng và hàm kiểm tra hàng đợi: ................................ 15
6.2.Chương trình cài đặt các thuật tốn thêm vào và lấy ra khỏi hàng đợi: .......15
A. Thêm khóa vào hàng đợi: ........................................................................15
B. Lấy khóa từ hàng đợi: ............................................................................. 17
C. Lấy thông tin các phần tử trong hàng đợi: .............................................. 19
7. Kết quả thực thi chương trình và giải thích: ........................................................... 19
7.1. Mơ tả hoạt động của hệ thống: .....................................................................19
8. Kết luận: ..................................................................................................................23

3


Trường Đại Học Sài Gịn

Báo Cáo Đồ Án

Danh Mục Hình
Hình 1: Sơ đồ tiến trình hàm thongtinxe. ...................................................................... 8
Hình 2: Danh sách liên kết đơn Fist .............................................................................10
Hình 3: Hàng đợi là một danh sách liên kết. ................................................................12
Hình 4: hàng đợi có một phần tử ................................................................................. 16
Hình 5: hàng đợi có nhiều phần tử. ..............................................................................16
Hình 6: xóa phần tử duy nhất của hàng đợi ................................................................. 18

Hình 7: Xóa một phần tử của hàng đợi có nhiều phần tử ............................................ 19
Hình 8: Trạm thi phí cho xe vào .................................................................................. 20
Hình 9: Trạm thu phí cho xe ra và vào ........................................................................ 20
Hình 10: Trạm thu phí bị đầy xe ..................................................................................21
Hình 11: Giải quyết hàng đợi bị đầy ............................................................................22

4


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

1.Đề bài:

A. Đề bài:

xe.

Trạm thu phí có một hàng đợi xe. Hàng đợi này có thể đủ chỗ cho 20

Xe qua trạm có những loại sau đây: xe container, xe tải, xe khách, và xe
con. Thông tin của mỗi xe bao gồm: số đăng ký, loại xe.
Vào mỗi thời điểm sẽ có một xe ra khỏi hàng đợi để qua trạm, và có thể
có ngẫu nhiên từ 0 đến 3 xe vào hàng đợi. Khi một xe qua trạm thì thơng tin
của xe được ghi nhận.
Tất cả các dữ liệu đều được khởi tạo ngẫu nhiên.
Chương trình chỉ được dừng lại khi một phím quy ước được nhấn hoặc
khi hàng đợi bị đầy.
B. Các yêu cầu cần được giải quyết của đề bài:

- Khởi tạo được các dữ liệu cho từng loại xe
- Thêm xe vào hàng đợi.
- Lấy xe ở đầu hàng đợi ra, in thông tin xe được lấy ra.

2.Mô tả hệ thống sẽ được xây dựng:
2.1.Xác định các đối tượng trong hệ thống và các
hàm khởi tạo các đối tượng đó:
Đề bài u cầu xây dựng chương trình có sử dụng cấu trúc dữ liệu để
mô tả hoạt động của một trạm thu phí.
Để xây dựng hoạt động của một trạm thu phí ta cần có thơng tin ra vào
của các loại xe. Ở đây gồm 4 loại xe: xe tải, xe khách và xe con. Mỗi loại xe lại
gồm các thông tin như: số đăng ký, loại xe.
Thông tin cho mỗi loại xe được xây dựng bởi cấu trúc sau:
struct car
{
string loaiXe;
int soDangKy = 0;
};
Mỗi xe gồm một biến kiểu string để lưu trữ tên của xe đó và một biến

5


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

kiểu int để lưu lại số đăng ký, ban đầu số đăng ký được gán bằng 0, sau đó
được hàm random gán lại một giá trị bất kỳ.
Hàm random được xây dựng như sau:

int random(int minN, int maxN) {
return minN + rand() % (maxN + 1 - minN);
}
Hàm radom sẽ nhận 2 giá trị đầu vào là maxN và minN, trong đó:
maxN là số ngẫu nhiên lớn nhất có thể , minN là số ngẫu nhiên nhỏ nhất có thể.
Hàm radom dựa trên hàm rand trong thư viện stdlib.h. Hàm này trả về
một số nguyên có kiểu dữ liệu là int.Tuy nhiên, hàm rand không random ra số
mới khi chạy lại code. Để có thể tạo ra số ngẫu nhiên mới cần kết hợp với hàm
srand trong phần main, và kết hợp với hàm time trong thư viện time.h.
Sau đó để tạo hàm sinh số ngẫu nhiên trong một đoạn dựa vào phép toán chia
dư. phép toán chia dư (%) của mọi số bất kỳ(a) cho một số b cố định: a % b sẽ
cho ra giá trị thuộc đoạn [0, b-1].
Để khởi tạo giá trị cho các biến của cấu trúc dữ liệu car, hàm sau sẽ khởi
tạo các giá trị một cách ngẫu nhiên dựa vào hàm random:
car* thongtinxe()
{
car* xe = new car;
int r = random(1, 4);
switch (r) {
case 1:
xe->loaiXe = "xe Tai";
break;
case 2:
xe->loaiXe = "xe Khach";
break;
case 3:
xe->loaiXe = "xe Con";
break;
case 4:
xe->loaiXe = "xe Container";

break;
}
xe->soDangKy = random(1, 100);
return xe;
}
Hàm thongtinxe không nhận dữ liệu đầu vào sẽ trả về một con trỏ có

6


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

kiểu dữ liệu car, con trỏ này sẽ trỏ tới các biến như loaiXe, soDangKy của xe.
Trong hàm thongtinxe sử dụng cấu trúc swich-case, biến r sẽ nhận giá trị
ngẫu nhiên từ 1 tới 4, khi đó nếu r trùng với bất kì case nào thì biến loaiXe sẽ
nhận giá trị tương ứng với case đó, sau đó hàm random tiếp tục sinh số ngẫu
nhiên từ 1 đến 100 để gán giá trị cho biến soDangKy.
Flow chart:

7


Trường Đại Học Sài Gịn

Báo Cáo Đồ Án

Hình 1: Sơ đồ tiến trình hàm thongtinxe.


8


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

2.2.Các chức năng của hệ thống:
- Khởi tạo thông tin xe.
- Khởi tạo hàng đợi.
- Kiểm tra hàng đợi rỗng, đầy.
- Khởi tạo số lượng xe vào hàng đợi (từ 0 đến 3 xe).
- Thêm xe vào cuối hàng đợi, đếm số lượng xe vào hàng đợi.
- Đếm số lượng xe trong hàng đợi, nếu hàng đợi đầy không cho xe tiếp
tục vào, nếu hàng đợi rỗng tiếp tục cho xe vào.
- Lấy xe ra khỏi hàng đợi ở vị trí đầu hàng.
- Lấy thông tin xe khi ra khỏi hàng đợi, đếm số lượng xe cịn lại trong
hàng đợi.
- In thơng tin xe trong hàng đợi.

3.Giải thích lý do sử dụng các cấu trúc dữ liệu để
mơ hình hóa các đối tượng dữ liệu trong hệ thống:
phí:

3.1.Dùng hàng đợi để mơ hình hóa trạm thu

Dùng cấu trúc dữ liệu hàng đợi để mơ hình hóa các đối tượng dữ liệu
trong trạm thu phí là một trong những cách tốt để mơ hình hóa được các đối
tượng dữ liệu vì:
Hàng đợi là một danh sách thêm vào ở đầu này và lấy ra ở đầu kia của

danh sách này. Hàng đợi còn được gọi là danh sách FIFO (Fist-In Fist-Out), tức
là thêm vào trước, lấy ra trước. Điều đó tương ứng với một trạm thu phí trong
thực tế. Trạm thu phí ở thực tế sẽ có một đầu vào và một đầu ra, mỗi xe vào
trong đầu tiên sẽ ra ở đầu còn lại đầu tiên. Vì sự tương đồng này nên việc mô tả
các đối tượng dữ liệu và cài đặt các hoạt động của trạm thu phí cũng dễ dàng
hơn.

3.2.Dùng danh sách liên kết để biểu diễn
thông tin xe trong trạm:
Đối với danh sách các loại xe và thông tin của từng xe trong trạm thu
phí sẽ được cài đặt bởi danh sách liên kết vì:
Các phần tử danh sách có thể được chèn hay xóa một cách dễ dàng mà
khơng cần phân bổ lại hoặc sắp xếp lại toàn bộ cấu trúc vì các mục dữ liệu
khơng cần được lưu trữ liên tục trong bộ nhớ hay trên đĩa, trong khi tái cấu trúc
một mảng tại thời gian chạy là một hoạt động tốn kém hơn nhiều. Danh sách
liên kết cho phép chèn hay xóa nút tại bất kì điểm nào trong danh sách.
Mặc khác, vì bản thân danh sách liên kết được liên kết đơn giản nên
không cho phép truy cập ngẫu nhiên tới dữ liệu hoặc bất kì hình thức đánh chỉ

9


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

mục hiệu quả nào, nhiều toán tử cơ bản như lấy nút cuối cùng của danh sách,
tìm một nút có chứa dữ liệu đã cho, hay tìm vị trí của nút để chèn một nút mới
sẽ yêu cầu lặp qua hầu hết hoặc tất cả các phần tử của danh sách.
Tuy nhiên trong chương trình khơng cần truy cập tới ngẫu nhiên một

phần tử, hay tìm kiếm trong danh sách mà chỉ quên tâm tới việc thêm và xóa
nên việc sử dụng danh sách liên kết thay cho mảng cũng dễ dàng hơn.

4.Giải thích cài đặt các cấu trúc dữ liệu:
4.1.Cấu trúc dữ liệu danh sách liên kết
A. Định nghĩa:
Với cấu trúc dữ liệu danh sách các xe trong hàng đợi được cài đặt bằng
danh sách liên kết, cụ thể là danh sách liên kết đơn:
Danh sách liên kết là một danh sách có cấu trúc dữ liệu tuyến tính các
phần tử liên kết với nhau bằng vùng liên kết của chúng. Mỗi phần tử có hai
vùng chình: vùng dữ liệu và vùng liên kết chứa địa chỉ của phần tử kế tiếp.
Vùng liên kết cuối của danh sách có giá trị là NULL.
Danh sách liên kết có đặt điểm là hai phần tử kế tiếp nhau không lưu kế
tiếp nhau trong bộ nhớ.
B. Cấu trúc dữ liệu của phần tử:
Fist

Data

Next

Hình 2: Danh sách liên kết đơn Fist

10


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án


Một phần tử của danh sách có các thuộc tính:
- Data: chứa nội dung dữ liệu của phần tử, thường là kiểu số
nguyên,chuỗi ký tự, một cấu trúc.
- Next: Con trỏ trỏ tới phần tử kế tiếp, có kiểu con trỏ phần tử hoặc kiểu
của phần tử.
Code:
struct car
{
string loaiXe;
int soDangKy = 0;
};
struct carlist
{
car* xe;
carlist* next;
};

4.1.Cấu trúc dữ liệu hàng đợi:
A. Định nghĩa:
Hàng đợi là một danh sách các đối tượng dữ liệu, một trong hai đầu
danh sách được xem là đầu hàng, còn đầu kia là đi hàng. Chẳng hạn, hàng
đợi có thể là danh sách các ký tự (a, b, c, d), trong đó a đứng ở đầu hàng, cịn d
đứng ở đi hàng. Chúng ta có thể thực hiện các phép tốn sau đây trên hàng
đợi, trong các phép tốn đó Q là một hàng đợi, còn x là một đối tượng cùng
kiểu với các đối tượng trong hàng Q.
1. Empty(Q). Hàm trả về true nếu hàng Q rỗng và false nếu không.
2. Enqueue(x, Q). Thêm đối tượng x vào đuôi hàng Q.
3. Dequeue(Q). Loại đối tượng đứng ở đầu hàng Q.
4. GetHead(Q). Hàm trả về đối tượng đứng ở đầu hàng Q, cịn hàng Q
thì khơng thay đổi.

Ví dụ. Nếu Q = (a, b, c, d) và a ở đầu hàng, d ở đi hàng, thì khi thực
hiện phép tốn Enqueue(e, Q) ta nhận được Q = (a, b, c, d, e), với e đứng ở
đi hàng, nếu sau đó thực hiện phép tốn Dequeue(Q), ta sẽ có Q = (b, c, d, e)
và b trở thành phần tử đứng ở đầu hàng.
Với các phép toán Enqueue và Dequeue xác định như trên thì đối
tượng vào hàng trước sẽ ra khỏi hàng trước. Vì lý do đó mà hàng đợi được gọi
là cấu trúc dữ liệu FIFO (viết tắt của cụm từ First- In First- Out). Điều này đối
lập với ngăn xếp, trong ngăn xếp đối tượng ra khỏi ngăn xếp là đối tượng sau
cùng được đặt vào ngăn xếp.

11


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

Hàng đợi sẽ được sử dụng trong bất kỳ hoàn cảnh nào mà chúng ta cần
xử lý các đối tượng theo trình tự FIFO. Cuối chương này chúng ta sẽ trình bày
một ứng dụng của hàng đợi trong mô phỏng một hệ phục vụ. Nhưng trước hết
chúng ta cần nghiên cứu các phương pháp cài đặt hàng đợi. Cũng như ngăn xếp,
chúng ta có thể cài đặt hàng đợi bởi mảng hoặc bởi DSLK.
B. Cài đặt hàng đợi bởi danh sách liên kết:
Cũng như ngăn xếp, chúng ta có thể cài đặt hàng đợi bởi DSLK. Với
ngăn xếp, chúng ta chỉ cần truy cập tới phần tử ở đỉnh ngăn xếp, nên chỉ cần
một con trỏ ngoài top trỏ tới đầu DSLK (xem hình 6.3). Nhưng với hàng đợi,
chúng ta cần phải truy cập tới cả phần tử ở đầu hàng và phần tử ở đi hàng, vì
vậy chúng ta cần sử dụng hai con trỏ ngoài: con trỏ front trỏ tới thành
phần đầu DSLK, tại đó lưu phần tử ở đầu hàng, và con trỏ rear trỏ tới thành
phần cuối cùng của DSLK, tại đó lưu phần tử ở đi hàng, như trong hình.

front
Data

Next

rear

Hình 3: Hàng đợi là một danh sách liên kết.
C. Cấu trúc dữ liệu của hàng đợi:
Hàng đợi có các thuộc tính sau:
- Front: con trỏ đầu lấy ra của hàng đợi, có kiểu con trỏ phần tử hoặc
kiểu của phần tử.
-Rear: con trỏ đầu thêm vào của hàng đợi, có kiểu con trỏ phần tử hoặc
kiểu của phần tử.
-Count: số phần tử hiện tại của hàng đợi.
Code:

12


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

struct Queue
{
carlist* front;
carlist* rear;
int cout;
};


5.Mã giả trình bày các thuật tốn thực hiện các
chức năng chính của chương trình:
5.1.Chức năng thêm xe vào cuối hàng đợi:
Mã giả:
Alogrithm Enqueue(ref queue, theInfo)
Tạo phần tử mới p có khóa là theInfo
If(queue rỗng) then
Đầu lấy ra front là p
Else
Phần tử cuối cùng trỏ p
End if
Đầu thêm vào rear là p
Tăng số phần tử hiện tại
End Enqueue

5.2.Chức năng lấy xe ra ở đầu hàng đợi:
Mã giả:
Alogrithm Dequeue(ref queue)
If(queue rỗng)
“Hang doi rong”
Else
p là front
If(queue chỉ có 1 phần tử)
Rear = NULL
End if
Front là phần tử sau p
Hủy bỏ phần tử p
End if
Giam số phần tử hiện tai


13


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

End Dequeue

5.3.Hiển thị thông tin trong hàng đợi:
Mã giả:
Alogrithm Display( queue)
If(queue rỗng)
“Hang doi rong”
Esle
p là đầu lấy ra front
While(p là phần tử của queue)
Hiển thị nội dung của p
p đến phần tử kế tiếp
End while
End if
End Display

6.Trình bày và giải thích chương trinh được viết
đề cài đặt các thuật tốn:
6.1. Các chương trình khởi tạo:
A. Khởi tạo danh sách liên kết:
carlist* createNode(car* data)
{

carlist* p = new carlist;
if (p == NULL)
{
cout << "Day bo nho" << endl;
exit(1);
}

}

else
{
p->xe = data;
p->next = NULL;
}
return p;

Đầu tiên, khởi tạo một biến con trỏ p, đây cũng là một node trong danh
sách liên kết. Nếu không cấp phát tiếp được bộ nhớ chứng tỏ bộ nhớ đã đầy,

14


Trường Đại Học Sài Gịn

Báo Cáo Đồ Án

thốt khỏi chương trình tại đây. Nếu có thể cấp phát được bộ nhớ thì biến con
trỏ xe của p nhận data làm dữ liệu. Phần next của p trỏ tới null.
B. Khởi tạo hàng đợi rỗng và hàm kiểm tra hàng đợi:
void InIt(Queue& queue)

{
queue.front = NULL;
queue.rear = NULL;
queue.cout = 0;
}
bool IsEmty(Queue queue)
{
return queue.front == NULL;
}
#define Max 20
bool IsFull(Queue queue)
{
return queue.cout >= Max;
}
Khỏi tạo hàng đợi rỗng bằng hàm InIt: gán các con trỏ front và
rear của queue bằng NULL vì con trỏ không được khởi tạo một giá trị,
chúng sẽ chứa giá trị rác. Ngồi địa chỉ vùng nhớ, có một giá trị mà con
trỏ có thể giữ được, đó là giá trị null. Null là một giá trị đặc biệt, điều
đó có nghĩa là con trỏ đó chưa trỏ đến địa chỉ nào cả.
Hàm IsEmpty và IsFull kiểm tra hàng đợi đang rỗng hay đầy. Việc này
rất cần thiết cho thuật toán thêm vào hàng đợi hay lấy ra khỏi hàng đợi. Hai
hàm này kiểm tra dựa vào hai con trỏ front (trỏ vào phần tử đầu tiên của hàng
đợi) và con trỏ count (đếm số lượng phần tử của hàng đợi).

6.2.Chương trình cài đặt các thuật tốn thêm
vào và lấy ra khỏi hàng đợi:
A. Thêm khóa vào hàng đợi:
void EnQueue(Queue& queue, carlist* p)
{
if (IsEmty(queue))

{
queue.front = p;

15


Trường Đại Học Sài Gòn

}

Báo Cáo Đồ Án

}
else
queue.rear->next = p;
queue.rear = p;
queue.cout++;

Hàm enqueue nhận vào một con trỏ danh sách liên kết p, nếu hàng đợi
rỗng thì hai con trỏ front và rear trỏ vào p, tăng số lượng phần tử lên. Nếu
khơng thì ta thêm vào cuối hàng đợi bằng cách cho con trỏ next của rear trỏ tới
p và sau đó chuyển p thành rear.
Ví Dụ: Nếu hàng đợi rỗng ta thêm vào hàng đợi phần tử xe tải như sau:
Front
Xe tải

Rear
Hình 4: hàng đợi có một phần tử
Nếu hàng đợi không rỗng mà chứa các phần tử xe con, xe khách ta thêm xe tải
vào hàng đợi như sau:

Front
Xe con

Rear

Rear
--------------->

Xe khách

Xe tải

Hình 5: hàng đợi có nhiều phần tử.

16


Trường Đại Học Sài Gịn

Báo Cáo Đồ Án

Q trình thêm khóa vào hàng đợi của ví dụ trên như sau:
- Tạo phần tử p có nội dung là xe tải.
- Nếu hàng đợi rỗng, đầu lấy ra front là p.
- Nếu hàng đợi khác rỗng, phần tử cuối cùng trỏ p.
- Đầu thêm vào rear là p: p là phần tử cuối cùng.
- Tăng số phần tử của hiện tại.
Hàm CarIn sẽ sữ dụng thuật toán Enqueue để thêm xe vào cũng như
kiểm soát số lượng xe vào, hàm gọi hàm random sau đó dựa trên số lượng xe
để thực hiện thêm vào, hàm cũng sẽ kiểm tra xem hàng đợi đã đầy chưa, nếu đã

đầy thì ngừng.
void CarIn(Queue& queue)
{
int r = 3;
int i = 0;
for (; i < r; i++)
{
if (IsFull(queue))
break;
EnQueue(queue, createNode(thongtinxe()));
}
soLuongXeVao(i);
}

B. Lấy khóa từ hàng đợi:
Hàm CarOut là hàm xây dựng dựa trên thuật toán Dequeue, do yêu cầu
đề bài là xe ra khỏi trạm thì lưu lại thông tin xe, nên hàm CarOut bao gồm hai
công việc là lấy xe ra khỏi hàng đợi và in thông tin xe.
Sau khi lấy xe ra khỏi hàng đợi hàm CarOut sẽ in ra thông tin xe.
void CarOut(Queue& queue)
{
cout << "So luong xe ra: 1" << endl;
cout << "Thong tin xe ra: " << endl;
if (IsEmty(queue))
exit(1);
else
{
carlist* p = queue.front;
if (queue.front == queue.rear)
queue.rear = queue.front = NULL;

queue.front = p->next;

17


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

cout << "Loai xe: " << p->xe->loaiXe << endl
<< " So dang ky: " << p->xe->soDangKy << endl;
delete p;
queue.cout--;

}

}
cout << "=======================================" << endl;

Nếu hàng đợi rỗng thì ta khơng thể lấy khóa ra khỏi hàng đợi. Nếu hàng
đợi chỉ có một khóa thì sau khi lấy khóa từ hàng đợi, hàng đợi là rỗng: đầu lấy
ra front là null, đầu thêm vào rear là null.
Nếu hàng đợi có nhiều hơn một khóa, sau khi lấy khóa ra khỏi hàng đợi
đầu thêm vào rear khơng bị thay đổi.
Ví dụ: Trong hàng đợi có duy nhất phần tử xe con để lấy xe con ra khỏi
hàng đợi ta làm như sau:
Front
Xe con

Rear


Front
Rear

Hình 6: xóa phần tử duy nhất của hàng đợi
Nếu trong hàng đợi có hai phần tử là xe con và xe khách, lấy xe con ra ngoài
như sau:

Front
Xe con

18


Trường Đại Học Sài Gịn

Front
---------->
Rear

Báo Cáo Đồ Án

Xe khách

Hình 7: Xóa một phần tử của hàng đợi có nhiều phần tử
Quá trình lấy xe con ra khỏi hàng đợi trong ví dụ trên được thực hiện như sau:
- p là phần tử đầu lấy ra front.
- Nếu hàng đợi chỉ có xe con thì sau khi lấy ra, hàng đợi là rỗng đầu
thêm vào rear là null.
- Nếu hàng đợi có nhiều hơn một khóa, sau khi lấy xe con ra từ hàng đợi,

đầu lấy ra front là phần tử sau p.
- Hủy bỏ phần tử p, giảm số phần tử trong hàng đợi lại.
C. Lấy thông tin các phần tử trong hàng đợi:
Hàm Display đầu tiên sẽ kiểm tra xem queue có rỗng khơng, nếu
khơng thì thực hiện khởi tạo một con trỏ p trỏ vào đầu ra front của hàng
đợi, sau đó dùng dịng while để thực hiện việc duyệt tuyến tính qua tồn
bộ hàng đợi cho tới khi p là phần tử cuối cùng của hàng đợi.
void DisPlay(Queue queue)
{
if (IsEmty(queue))
{
cout << "Khong co xe o hang doi" << endl;
exit(1);
}
carlist* p = queue.front;
while (p != NULL)
{
cout << "Thong tin cac xe trong hang doi " << endl
cout << "Loai xe " << p->xe->loaiXe << endl << "So dang ky " << p->xe>soDangKy << endl;
p = p->next;
}
cout << "=======================================" << endl;
}

7.Kết quả thực thi chương trình và giải thích:
7.1. Mô tả hoạt động của hệ thống:
19


Trường Đại Học Sài Gòn


Báo Cáo Đồ Án

Đầu tiên hệ thống sẽ dùng hàm random để khởi tạo thông tin xe và số
lượng xe vào trạm, hệ thống sẽ in số lượng xe vào trạm, tiếp theo hệ thống sẽ in
các thông tin của từng xe trong trạm, hệ thống sẽ gọi hàm CarOut để thực hiện
thực toán Dequeue, cho xe qua trạm và lấy lại thông tin xe.

Những xe vào đầu tiên sẽ là những xe
ra khỏi trạm đầu tiên, những xe tiếp theo sẽ ra
tuần tự tiếp theo.

Hình 8: Trạm thi phí cho xe vào
Mỗi lần có một xe ra thì có ngẫu
nhiên 0 tới 3 xe vào trạm.
Hệ thống sẽ tiếp tục cho xe vào cho
tới khi hàng đợi của trạm đầy xe.

Hình 9: Trạm thu phí cho xe ra và vào

20


Trường Đại Học Sài Gịn

Báo Cáo Đồ Án

Hình 10: Trạm thu phí bị đầy xe
Khi hàng đợi bị đầy trạm thu phí sẽ khơng cho xe vào nữa, sau đó cho
lần lượt từng xe qua trạm, mỗi xe qua trạm sẽ được ghi thông tin lại, thực hiện

cho tới khi hàng đợi khơng cịn xe, sau đó tiếp tục cho xe vào.

21


Trường Đại Học Sài Gịn

Báo Cáo Đồ Án

Hình 11: Giải quyết hàng đợi bị đầy
Sau khi hàng đợi rỗng thì tiếp tục cho xe vào, nếu hàng đợi tiếp tục đầy
thì thực hiện lại bước trên, cứ như thế hệ thống sẽ hoạt động liên tục nhờ vào
vòng lặp, vòng lặp này sẽ dừng lại khi người dùng ấn một phím bất kì.

22


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

8.Kết luận:
Hàng đợi(tiếng anh: Queue) 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”.
Hình ảnh về hàng đợi rất hay gặp trong đời sống hàng ngày, hình ảnh
việc xếp hàng dưới đây là một mô phỏng dễ hiểu nhất cho cấu trúc dữ liệu hàng
đợi(queue): Người vào đầu tiên sẽ được tiến đón đầu tiên;Người mới vào bắt
buộc phải xếp hàng ở phía cuối.
Trong cấu trúc hàng đợi(queue), ta chỉ có thể thêm các phần tử vào một

đầu của queue(giả sử là cuối), và cũng chỉ có thể xóa phần tử ở đầu còn lại của
queue(tạm gọi là đầu). Như vậy, ở một đầu không thể xảy ra hai hành động
thêm và xóa đồng thời.
Như vậy, với cấu trúc Hàng đợi(Queue), chúng ta có các chức năng sau:
 EnQueue:

Thêm phần tử vào cuối(rear) của Queue.

 DeQueue:

Xóa phần tử khỏi đầu(front) của Queue. Nếu Queue rỗng thì
thơng báo lỗi.

23


Trường Đại Học Sài Gòn

Báo Cáo Đồ Án

Tài liệu tham khảo
[1] Nguyễn Trung Trực (2019), Cấu Trúc Dữ Liệu Và Giải Thuật, NXB Đại
Học Quốc Gia TP. Hồ Chí Minh.
[2] Đinh Mạnh Tường (2007), Giáo Trình Cấu Trúc Dữ Liệu Và Giải Thuật,
NXB Trường Đại Học Công Nghệ, Đại Học Quốc Gia Hà Nội.

24




×