Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
1,56 MB
Nội dung
Đề tài: Ứngdụng Stack- Ngănxếp Phần I: Giới thiệu ngănxếp Khái niệm Ngănxếp dạng đặc biệt danh sách mà việc bổ sung hay loại bỏ phần tử thực đầu danh sách gọi đỉnh Nói cách khác, ngănxếpcấutrúcliệu có thao tác bản: bổ sung (push) loại bỏ (pop), loại bỏ tiến hành loại phần tử đưa vào danh sách Chính tính chất mà ngănxếp gọi kiểu liệu có ngun tắc LIFO (Last in first out – vào sau trước) Các tác vụ ngănxếp a) Initialize Chức năng: Khởi động ngănxếpDữliệu nhập: Không Dữliệu xuất: stack top vị trí khởi đầu b) Empty Chức kiểm tra ngănxếp có bị rỗng khơng Dữliệu nhập: Không Dữliệu xuất: True or False (True: ngănxếp rỗng, False: ngănxếp không bị rỗng) c) Pusth Chức năng: thêm nút đỉnh ngănxếpDữliệu nhập: nút Dữliệu xuất: khơng d) Pop Chức năng: xóa nút đỉnh ngănxếpDữliệu nhập: Không Điều kiện: stack không bị rỗng Dữliệu xuất: nút bị xóa Stacktop: e) Chức năng: truy xuất nút đỉnh ngănxếpDữliệu nhập: Không Điều kiện: stack không bị rỗng Dữliệu xuất: nút đỉnh ngănxếp Stacksize f) Chức năng: xác định số nút có ngănxếpDữ liệu: Khơng Dữliệu xuất: số nút có ngănxếp Clearstack g) Chức năng: xóa tất nút ngănxếpDữliệu nhập: không Dữliệu xuất:stack top vị trí khởi đầu h) Copystack: Chức năng: copy ngănxếp thành ngănxếpDữliệu nhập: stack nguồn Dữliệu xuất: ngănxếp giống ngănxếp cũ Phương pháp cài đặt ngănxếp Có nhiều cách cài đặt ngănxếp đơn giản đểdễ hình dung cài đặt mảng hay gọi cài đặt theo kiểu Ngồi nhiều cách cài đặt khác cài đặt Danh sách liên kết (DSLK đơn, DSLK vòng, DSLK kép, DSLK vòng+kép) Phần II: Ứngdụngngănxếp vào toán cụ thể- Bài tốn sửa kho tàu Mơ tả toán Xét mạng đường sắt sau đây: Các toa tàu đường ray A bên phải (được đánh số 1, 2, , n) cần phải hoán vị chuyển sang đường ray B bên trái B xem đầu toa tàu, A xem đầu vào Một toa chuyển thẳng sang đường ray bên trái, hay rẽ xuống đường ray bên cạnh (để sửa chữa) để sau đường ray bên trái Các toa tàu không phép ngược chiều Cho trước hoán vị toa tàu đầu B Hãy cho biết liệu hốn vị có xảy hay khơng Ví dụ: Ở đầu vào, có toa tàu, đầu toa tàu theo thứ tự 3, 1, 4, Hốn vị khơng thể xảy Vì toa toa 3, điều chứng tỏ thẳng đầu B, toa chuyển vào kho Khi khỏi kho toa phải trước nghĩa phải có thứ tự trước Điều mâu thuẫn với thứ tự sau hoán vị 3, 1, 4, 2 Ý tưởng toán Bài toán cần kiểm tra tính hợp lệ hốn vị toa tàu đường ray ra, dãy toa đường ray vào mặc định dãy 1, 2, , n theo thứ tự từ trái qua phải - Gọi (b) = {b1, b2, , bn} dãy toa tàu đường ray vào, bi = i với i = 1, 2, ,n - Gọi (a) = {a1, a2, , an} dãy toa tàu đường ray Việc kiểm tra tính hợp lệ dãy (a) sau: Lần lượt xét toa tàu đường ray theo chiều từ trái sang phải, nghĩa ităng dần từ 1, 2, , đến n - Với toa ta tìm xem có đường ray vào khơng - Nếu có (b) toa tàu d có có số nhỏ chắn đưa vào kho sửa chữa, ví dụ với n = 5, a = chắn toa 1, 2, đưa vào kho sửa chữa Khi ta đưa tất toa d vào kho (tức đẩy chúng vào ngăn xếp), trước xét toa tầu đường rayra - Nếu (b) chắn phải kho, phải vị trí cửa kho sửa chữa (đỉnh ngăn xếp) Nếu có vị trí cửa kho ta “lấy ra” khỏi kho, ngược lại chứng tỏ dãy (a) dãy hốn vị khơng hợp lệ i, dấu hiệu để kiểm tra dãy (a) có hợp lệ hay khơng Thuật tốn Bước 1: nhập số toa tàu, nhập hoán vị đầu cho trước b[i], đầu vào a[i] đánh STT 1…n Bước 2: Nếu stack có phần tử so sánh với phần tử mảng b xét 2.1 i=1 2.2 Nếu phần tử x đỉnh stack = b[i] xét: chuyển 2.3, ngược lại tới 2.7 2.3 c[i]=b[i] 2.4 in toa chuyển từ kho đường ray C 2.5 tăng i thêm 1; 2.6 kiểm tra ngănxếp Nếu ngănxếp rỗng chuyển bước 3, ngược lại chuyển bước 2.2 2.7 Dừng lại Bước 3: Nếu stack k có phần tử kiểm tra phần tử mảng đầu vào 3.1 j=1 3.2 Nếu a[j] = b[i], tới 3.3, ngược lại tới 3.7 3.3 c[i] = b[i]; 3.4 In cách dịch chuyển toa này: từ đường ray vào A đến đường ray C 3.5 Tăng j : j++ 3.6 Kiểm tra jtop = - 1; return; } // Kiem tra nganxep rong int stackEmpty( stack *s) { if(s->top == -1) return 1; return 0; } // Them phan tu vao nganxep int push(stack *s, int x) { s->top = (s->top) + 1; s->d[s->top] = x; return s->d[s->top]; } // Lay phan tu khoi nganxep int pop(stack *s) { return(s->d[s->top ]); } // Ham kiem tra hoan vi co xay hay khong void KiemTra() { stack s; s.top = -1; int *a, *c; int i, j, count, found, x; count = 1; found = 0; a = (int*)malloc((n+1)*sizeof(int)); c = (int*)malloc((n+1)*sizeof(int)); printf("\n Ta chuyen lan luot roi dua thong bao hoan vi co xay hay khong.\n "); for(i = 1; i