thảo luận cấu trúc dữ liệu và giải thuật, đề tài ứng dụng của stack ngăn xếp

15 299 2
thảo luận cấu trúc dữ liệu và giải thuật, đề tài ứng dụng của stack  ngăn xếp

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đề tài: Ứng dụng Stack- Ngăn xếp Phần I: Giới thiệu ngăn xếp Khái niệm Ngăn xế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ăn xếp cấu trúc liệuthao 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ăn xế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ăn xếp a) Initialize Chức năng: Khởi động ngăn xếp Dữ 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ăn xếp có bị rỗng khơng Dữ liệu nhập: Không Dữ liệu xuất: True or False (True: ngăn xếp rỗng, False: ngăn xếp không bị rỗng) c) Pusth Chức năng: thêm nút đỉnh ngăn xếp Dữ 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ăn xếp Dữ 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ăn xếp Dữ 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ăn xếp Stacksize f) Chức năng: xác định số nút có ngăn xếp Dữ liệu: Khơng Dữ liệu xuất: số nút có ngăn xếp Clearstack g) Chức năng: xóa tất nút ngăn xếp Dữ 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ăn xếp thành ngăn xếp Dữ liệu nhập: stack nguồn Dữ liệu xuất: ngăn xếp giống ngăn xếp cũ Phương pháp cài đặt ngăn xếp Có nhiều cách cài đặt ngăn xế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: Ứng dụng ngăn xế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ăn xếp Nếu ngăn xế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 ngan xep rong int stackEmpty( stack *s) { if(s->top == -1) return 1; return 0; } // Them phan tu vao ngan xep 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 ngan xep 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

Ngày đăng: 13/11/2018, 22:23

Từ khóa liên quan

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

Tài liệu liên quan