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

7 517 4
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

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

Thông tin tài liệu

ĐỀ 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 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) Ngoài ra, 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 TOÁN Ý tưởng thuật toán Các khách hàng đến xếp vào hàng đợi đến lượt phục vụ mua vé tàu Để đơn giản ta thiết kế hàng đợi 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 toá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: Thoá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: Thoá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 Đánh giá độ phức tạp thuật toán - Độ phức tạp câu lệnh: O(1) - Độ phức tạp vòng for nhỏ bao câu lệnh: O(n) Áp dụng quy tắc (quy tắc nhân) T(n) = O(1 n) = O(n) Vậy độ phức tạp thuật toán O(n) III CHƯƠNG TRÌNH MINH HỌA Đầu tiên khai báo thư viện mà ta sử dụng để chứa lớp: List.h #include #include "list.h" + Thao tác khởi tạo hàng đợi: Tạo hàng đợi có tên l Thực việc gán giá trị NULL cho biến head, giá trị NULL cho biến tail 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ử hàng đợi để thuận tiện cho việc kiểm tra hàng đợi đầy rỗng Khi cần chuỗi có kích thước danh sách hàng đợi cần phải xin số ô nhớ đủ cho kích thước hàng đợi lệnh malloc(sizeof(list)) 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 false để kiểm tra hàng đợi, số phần tử 0, giá trị count trả kết (True)-> hàng đợi rỗngcòn không 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ử vào cuối hàng đợi (giả sử hàng đợi chưa đầy) Cấp phát nhớ cho phần tử Gán giá trị NULL cho phần tử hàng đợi Gán giá trị value cho 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 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 thao tác loại bỏ phần tử hàng đợi 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 thao tác xem phần tử đầu, phần tử đầu có giá trị NULL trả kết hàng đợi NULL, không phần tử phần tử 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) { 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 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 #define LIST_H #include typedef struct node_s { 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; }

Ngày đăng: 19/05/2016, 20:34

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan