sử dụng cấu trúc hàng đợi để xây dựng hệ thống quản lý vé tàu 15

10 33 0
sử dụng cấu trúc hàng đợi để xây dựng hệ thống quản lý vé tàu 15

Đang tải... (xem toàn văn)

Thông tin tài liệu

BÀI TẬP LỚN MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI 1: SỬ DỤNG CẤU TRÚC HÀNG ĐỢI ĐỂ XÂY DỰNG HỆ THỐNG QUẢN LÝ BÁN VÉ TÀU I KHÁI NIỆM HÀNG ĐỢI VÀ CÁC ĐẶC TRƯNG CỦA HÀNG ĐỢI Khái niệm hàng đợi Hàng đợi cấu trúc liệu gần giống với ngăn xếp, khác với ngăn xếp nguyên tắc chọn phần tử cần lấy khỏi tập phần tử Trái ngược với ngăn xếp, phần tử lấy khỏi hàng đợi phần tử đưa vào mà phần tử lưu hàng đợi lâu Quy luật hàng đợi gọi Vào trước – Ra trước (First in – First out) Như ta định nghĩa hàng đợi dạng đặc biệt danh sách mà việc lấy phần tử thực đầu (gọi đầu hàng), việc bổ sung phần tử thực đầu (gọi cuối hàng) Một số thao tác hàng đợi - Enqueue: thêm phần tử vào hàng đợi - Dequeue: xóa phần tử khỏi hàng đợi - Clear: xóa tất phần tử hàng đợi - Count: đếm số phần tử hàng đợi - IsEmpty: kiểm tra hàng đợi có rỗng hay khơng 3 Các đặc trưng hàm đợi Thứ tự mà mà theo cơng việc hàng xếp phục vụ gọi quy tắc phục vụ Hầu hệ thống xếp hàng ngày sử dụng để phục vụ khách hàng theo trình tự mà chúng tới Trình tự phục vụ FIFS( First Come First Served) Ngồi ra, cịn có số kiểu phục vụ khác là: - LCFS( Last Come First Served) hay LIFO (Last In First Out): Theo khách hàng đến sau phục vụ trước - LCFSPR( LCFS With Pre- Emptive): Khi khách hàng đến sau chỗ khách hàng phục vụ xong phục vụ tiếp tục khách hàng bị chỗ nơi mà bị ngắt trước đây, trường hợp ta có dịch vụ với quyền ưu tiên phục vụ trước – LIFOPR - RR(Round Robin): Phục vụ vòng tròn, thời gian tài nguyên phân chia thành số khoản nhỏ có độ dài cố định gọi lượng tử II THUẬT TỐN Ý tưởng thuật tốn Các khách hàng đến xếp vào hàng đợi đến lượt phục vụ Để đơn giản ta thiết kế hàng Các khách hàng chọn để phục vụ theo nguyên tắc” đến trước phục vụ trước” nghĩa phục vụ cho khách hàng đứng đầu hàng Khi khách hàng đứng đầu hàng phục vụ xong đến lượt khách hàng tiến hành thủ tục mua vé Khi có khách hàng đến mua vé xếp vào hàng đợi rỗng hàng đợi chưa đầy Cần xây dựng chức cần thiết cho chương trình: - Khởi tạo hàng đợi - Kiểm tra hàng đợi có rỗng khơng - Thêm phần tử vào hàng, giả sử hàng đợi chưa đầy - Loại phần tử khỏi hàng, phần tử bị loại phần tử đầu hàng, thường phần tử vừa xử lý xong - Xem phần tử đầu hàng - Phần tử đầu hàng phục vụ trước Thuật toán Queue hàng đợi để lưu phần tử, có quy tắc phần tử vào trước trước Head vị trí phần tử Queue Coun: Lưu số lượng phần tử Queue Thuật tốn ta viết riêng rẻ sau, muốn tổng hợp gộp đoạn lại với Thêm phần tử vào hàng đợi B1: if(IsFull()) B3; else B2; B2: Coun++; Jump(B4); B3: printf(“Hàng đợi full”); B4: Thốt chương trình Xóa phần tử khỏi Queue B1: If(IsEmpty()) b4;else B2; B2: Queue[Head].check = false; B3: Head = (Head+1)%MAX; Coun ; Jump(B5); B4: printf(“Hàng đợi Empty”); B5: Thốt chương trình Kiểm tra hàng đợi có Empty hay khơng? B1: if(CounMAX) return true; else return false; In phần tử x Queue III CHƯƠNG TRÌNH MINH HỌA, ĐÁNH GIÁ ĐỘ PHỨC TẠP CỦA THUẬT TOÁN Đầu tiên khai báo thư viện mà ta sử dụng để chứa lớp: List.h Việc #include , với dấu thường là thư viện đã có sẵn của - trình biên dịch, nằm thư mục Include thư mục cài đặt trình biên dịch Với những thư viện chính ta tạo ,nên include nó bằng dấu nháy kép "" #include #include "list.h" + Thao tác khởi tạo hàng đợi: Tạo hàng đợi có tên là l Thực hiện việc gán giá trị bằng NULL cho biến head, giá trị NULL cho biến tail và giá trị cho biến count, cho biết hàng đợi trạng thái rỗng Biến count cho biết số phần tử hiện tại của hàng đợi để thuận tiện cho việc kiểm tra hàng đợi đầy hoặc rỗng Khi cần chuỗi có kích thước của danh sách hàng đợi vì cần phải xin số ô nhớ đủ cho kích thước của hàng đợi bằng lệnh malloc(sizeof(list)) Câu lệnh malloc dùng để cấp phát nhớ động (cấp vùng nhớ để trỏ tới mà mình rõ vùng nhớ này thay đổi nào chương trình) list* list_create() { list *l = (list*)malloc(sizeof(list)); l->head = NULL; l->tail = NULL; l->count = 0; return l; } + Thao tác kiểm tra hàng đợi: dùng hàm trả giá trị True hoặc false để kiểm tra hàng đợi, số phần tử bằng 0, giá trị count của pl bằng thì trả kết là (True)-> hàng đợi rỗngcòn không thì trả kết sai (False) -> hàng đợi không rỗng bool list_isNull(list *pl) { if (pl->count == 0) return true; else return false; } + Thao tác thêm vào hàng đợi: thêm phần tử mới vào cuối hàng đợi (giả sử hàng đợi chưa đầy) Cấp phát nhớ cho phần tử mới Gán giá trị NULL cho phần tử của hàng đợi Gán giá trị value cho phần tử mới Nếu hàng đợi có phần tử cuối bằng NULL (vô hiệu lực ko sử dụng đc) thì cho trỏ tiếp vào đầu hàng đợi trỏ đến nó, không thì phần tử cuối là phần tử mới thêm vào hàng đợi Lúc này, nút này bây giờ trở thành nút cuối của hàng đợi , tăng biến đếm lên đơn vị vì hàng đợi thêm mới phần tử void list_push_end(list *pl, void *value) { node *p = (node*)malloc(sizeof(node)); p->next = NULL; p->value = value; if (pl->tail == NULL) pl->head = p; else pl->tail->next = p; pl->tail = p; pl->count++; } + Thao tác kiểm tra hàng đợi: sau thêm phần tử, kiểm tra hàng đợi đã đầy chưa Con trỏ p trỏ vị trí của hàng đợi Lúc này nút trở thành nút của hàng đợi, trỏ trỏ đến nút này Gán giá trị đầu của danh sách cho trỏ p là phần tử Giảm biến đếm count xuống đơn vị Giải phóng nhớ Nếu phần tử đầu của hàng đợi có giá trị NULL thì phần tử cuối đưa giá trị NULL void list_remove_head(list *pl) { node *p = pl->head; pl->head = p->next; pl->count ; free(p); if (pl->head == NULL) pl->tail = NULL; } + Thao tác loại bỏ phần tử khỏi hàng đợi: bắt đầu thực hiện thao tác loại bỏ phần tử của hàng đợi Nếu phần tử có giá trị NULL thì trả giá trị NULL Con trỏ v trỏ nút mới của hàng đợi ,nút này bây giờ trở thành nút của hàm đợi Xóa phần tử đầu của hàng đợi, trả giá trị trỏ v void* list_pop_begin(list *pl) { if (pl->head == NULL) return NULL; void *v = pl->head->value; list_remove_head(pl); return v; } + Thao tác xem phần tử đầu: thực hiện thao tác xem phần tử đầu, phần tử đầu có giá trị NULL thì trả kết hàng đợi là NULL, không thì phần tử mới là phần tử của hàng đợi void* list_begin(list *pl) { if (pl->head == NULL) return NULL; return pl->head->value; } + Thao tác hiển thị phần tử hàng đợi void list_clear(list *pl) { // xóa các đề mục nhớ node *p = pl->head; while (p) { pl->head = p->next; free(p); p = pl->head; } pl->tail = NULL; pl->count = 0; } + Thao tác hủy hàng đợi: thực hiện thao tác hủy hàng đợi void list_destroy(list *pl) { list_clear(pl); free(pl); } - Sau đó, để thực định nghĩa thao tác : List.cpp #ifndef LIST_H // đoạn mã dịch _LIST_H chưa dịnh nghĩa #define LIST_H // định nghĩa tên gọi cho hằng để có thể sử dụng nó #include typedef struct node_s { // khai báo tên cho struct node, mặc dù struct này chưa định nghĩa, trình biên dịch cho phép thực hiện theo cách này Ngôn ngữ C cho phép định nghĩa struct tự tham chiếu Có nghĩa là, bên định nghĩa struct, có thể có trỏ trỏ tới struct kiểu Trong thực tế, struct tự tham chiếu này sử dụng để hiện thực các cấu trúc dữ liệu phức tạp danh sách liên kết, nhị phân… void *value; node_s *next; } node; typedef struct list_s { node *head, *tail; int count; } list; list* list_create(); bool list_isNull(list *pl); void list_push_end(list *pl, void *value); void list_remove_head(list *pl); void* list_pop_begin(list *pl); void* list_begin(list *pl); void list_clear(list *pl); void list_destroy(list *pl); #endif - Đây đoạn code thực thi chương trình: main.cpp #include #include "list.h" int main() { int soLuong = 9; int khach_hang[] = { 1,3,5,77,9,2,4,6,8 }; // Khoi tao list *queue = list_create(); // kiem tra queue bool b = list_isNull(queue); // Them vao queue for (int i = 0; i < soLuong; i++) { list_push_end(queue, khach_hang + i); } // kiem tra queue b = list_isNull(queue); // so luong int soLuongQueue = queue->count; // Loai bo mot phan tu queue list_pop_begin(queue); // kiem tra so luong sau loai bo soLuongQueue = queue->count; // Xem phan tu dau int phanTuDau = *(int*)list_begin(queue); printf("Phan tu dau: %d\n", phanTuDau); // Hien thi cac phan tu queue printf("Cac phan tu co queue: "); for (int i = 0; i < soLuongQueue; i++) { int *v = (int*)list_pop_begin(queue); printf("%d ", *v); } // Huy queue list_destroy(queue); // printf("\n"); system("pause"); return 0; } ... đầu hàng Khi khách hàng đứng đầu hàng phục vụ xong đến lượt khách hàng tiến hành thủ tục mua vé Khi có khách hàng đến mua vé xếp vào hàng đợi rỗng hàng đợi chưa đầy Cần xây dựng chức cần thiết... Khởi tạo hàng đợi - Kiểm tra hàng đợi có rỗng khơng - Thêm phần tử vào hàng, giả sử hàng đợi chưa đầy - Loại phần tử khỏi hàng, phần tử bị loại phần tử đầu hàng, thường phần tử vừa xử lý xong...3 Các đặc trưng hàm đợi Thứ tự mà mà theo cơng việc hàng xếp phục vụ gọi quy tắc phục vụ Hầu hệ thống xếp hàng ngày sử dụng để phục vụ khách hàng theo trình tự mà chúng tới Trình

Ngày đăng: 10/11/2021, 11:16

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan