Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 61 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
61
Dung lượng
486,07 KB
Nội dung
GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU CẤU TRÚC DỮ LIỆU DATA STRUCTURES [214331] STACK - QUEUE /XX 12/3/15 Teacher: Nguyễn Xuân Vinh Email: nguyenxuanvinh@hcmuaf.edu.vn /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Nội dung Ngăn xếp Hàng đợi GV: NGUYỄN XUÂN VINH Nội dung Ngăn xếp (Stack) Khái niệm Stack Các thao tác Stack /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Hiện thực Stack Ứng dụng Stack Hàng đợi GV: NGUYỄN XUÂN VINH Stack - Khái niệm Stack danh sách mà đối tượng thêm vào lấy đầu danh sách Vì thế, việc thêm đối tượng vào Stack lấy đối tượng khỏi Stack thực theo chế LIFO (Last In First Out - Vào sau trước) Các đối tượng thêm vào Stack lúc có đối tượng thêm vào sau /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU phép lấy khỏi Stack /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Các phép toán cần có Stack GV: NGUYỄN XUÂN VINH Stack – Các thao tác Stack hỗ trợ thao tác chính: “Push”: Thao tác thêm đối tượng vào Stack “Pop”: Thao tác lấy đối tượng khỏi Stack Ví dụ: /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 532 Pop Push GV: NGUYỄN XUÂN VINH Stack – Các thao tác /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Stack hỗ trợ số thao tác khác: isEmpty(): Kiểm tra xem Stack có rỗng không Top(): Trả giá trị phần tử nằm đầu Stack mà không hủy khỏi Stack Nếu Stack rỗng lỗi xảy GV: NGUYỄN XUÂN VINH Hiện thực Stack Mảng chiều Kích thước stack thiếu, lúc Danh sách LK Danh sách liên kết! MÔN: CẤU TRÚC DỮ LIỆU thừa /XX 12/3/15 Push/Pop dễ Push / Pop phức tạp dàng GV: NGUYỄN XUÂN VINH Hiện thực Stack dùng mảng Có thể tạo Stack cách khai báo mảng chiều với kích thước tối đa N (ví dụ: N =1000) MÔN: CẤU TRÚC DỮ LIỆU Stack chứa tối đa N phần tử đánh số từ đến N-1 Phần tử nằm đỉnh Stack có số top (lúc Stack chứa top+1 phần tử) Như vậy, để khai báo Stack, ta cần mảng chiều list, biến số nguyên top cho biết số đỉnh Stack: class Stack { int list[] = new int[N]; int top; /XX 12/3/15 }; GV: NGUYỄN XUÂN VINH 10 Hiện thực Stack dùng mảng Ngăn xếp cài đặt mảng phải có: Một biến top dùng để lưu vị trí trỏ Một mảng dùng để lưu giá trị ngăn xếp Khởi tạo ngăn xếp rỗng: Ngăn xếp rỗng ngăn xếp không chứa phần tử Đỉnh ngăn xếp không trỏ 10 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU tới phần tử Kiểm tra ngăn xếp rỗng: Ngăn xếp rỗng top = -1 Kiểm tra ngăn xếp đầy: Ngăn xếp đầy top = max – GV: NGUYỄN XUÂN VINH Hiện thực Queue dùng mảng r f MÔN: CẤU TRÚC DỮ LIỆU A A[0] A[1] A[2] 5 A[N-1] DeQueue(Q) 12/3/15 EnQueue(5,Q) /XX DeQueue(Q) 47 EnQueue(5,Q) DeQueue(Q) Cách dùng mảng GV: NGUYỄN XUÂN VINH Hiện thực Queue dùng mảng 48 r f MÔN: CẤU TRÚC DỮ LIỆU A A[0] A[1] 5 A[2] A[N-1] DeQueue(Q) EnQueue(5,Q) EnQueue(5,Q) 48 /XX 12/3/15 DeQueue(Q) DeQueue(Q) DeQueue(Q), EnQueue(5,Q), DeQueue(Q), EnQueue(5,Q),……… Cách dùng mảng GV: NGUYỄN XUÂN VINH Hiện thực Queue dùng mảng 49 r f MÔN: CẤU TRÚC DỮ LIỆU A A[0] A[1] A[2] 5 A[N-1] DeQueue(Q) EnQueue(5,Q) EnQueue(5,Q) 49 /XX 12/3/15 DeQueue(Q) DeQueue(Q) DeQueue(Q), EnQueue(5,Q), DeQueue(Q), EnQueue(5,Q),……… Cách dùng mảng GV: NGUYỄN XUÂN VINH Hiện thực Queue dùng mảng 50 MÔN: CẤU TRÚC DỮ LIỆU r A A[0] A[1] f A[2] A[N-1] 50 /XX 12/3/15 DeQueue(Q), EnQueue(5,Q), DeQueue(Q), EnQueue(5,Q),……… Cách dùng mảng GV: NGUYỄN XUÂN VINH Hiện thực Queue dùng mảng 51 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 51 Cần có hai biến head tail để giữ điểm đầu cuối hàng đợi Các phần tử thuộc hàng đợi phải nằm điểm đầu cuối Có thể có thêm biến count dùng để kiểm soát số phần tử GV: NGUYỄN XUÂN VINH Hiện thực Queue dùng mảng 52 52 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Để lấy phần tử hàng đợi ta lấy đầu hàng head tăng Để thêm phần tử vào hàng ta thêm vào cuối hàng tail tăng Sử dụng cấu trúc vòng Khởi tạo hàng đợi rỗng: Đặt head = 0; Tail = max-1; Count = 0; GV: NGUYỄN XUÂN VINH MÔN: CẤU TRÚC DỮ LIỆU Hiện thực Queue dùng mảng Kiểm tra hàng đợi rỗng: Tổng số phần tử count[...]... MÔN: CẤU TRÚC DỮ LIỆU ra khỏi Queue luôn diễn ra ở đầu Queue Vì thế, việc thêm một đối tượng vào Queue hoặc lấy một đối tượng ra khỏi Queue được thực hiện theo cơ chế FIFO (First In First Out - Vào trước ra trước) 32 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 32 GV: NGUYỄN XUÂN VINH Queue - Khái niệm Imaging 33 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Các phép toán trên Queue GV: NGUYỄN XUÂN VINH. .. 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Thuật toán tính giá trị 25 GV: NGUYỄN XUÂN VINH 2*((3+4)-(5-6)) Example: 2 3 4 + 5 6 - - * Push 2 4 Push 3 3 Push 4 2 Read + MÔN: CẤU TRÚC DỮ LIỆU Pop 4, Pop 3, 6 3 + 4 = 7 Push 7 5 Push 5 7 Push 6 2 Read Pop 6, Pop 5, 5 - 6 = -1 Push -1 -1 Read - 7 Pop -1, Pop 7, 7 - -1 = 8 2 26 /XX 12/3/15 Push 8 8 Read * Pop 8, Pop 2, Push 16 2 2 * 8 = 16 16 GV: NGUYỄN XUÂN VINH Chuyển... ABC*+DEF-ABC*+DEF / 28 ( ABC*+DEF- / 28 GV: NGUYỄN XUÂN VINH Ví dụ A + (B*C - (D/E^F) * G) * H 29 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU KQ=ABC*DEF^/G*-H*+ GV: NGUYỄN XUÂN VINH 30 Nội dung Ngăn xếp (Stack) Hàng đợi (Queue) Khái niệm Queue 30 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Các thao tác trên Queue Hiện thực Queue Ứng dụng Queue GV: NGUYỄN XUÂN VINH 31 Queue - Khái niệm Queue là một danh... xếp: Top bây giờ là top.next 16 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Thêm một phần tử 17 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Xóa một phần tử GV: NGUYỄN XUÂN VINH 18 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 18 Stack - Ứng dụng Stack thích hợp lưu trữ các loại dữ liệu mà trình tự truy xuất ngược với trình tự lưu trữ Một số ứng dụng của Stack: Trong trình biên dịch... khỏi Stack, nếu Stack khác rỗng thì quay lên bước 2, ngược lại thì dừng GV: NGUYỄN XUÂN VINH Stack - Ứng dụng Bài tập: đổi số từ cơ số 10 sang cơ số x 20 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 57 1 2 Ví dụ: 57 = ???2 57 = 1110012 28 2 0 14 2 0 7 2 1 3 2 1 1 2 1 0 GV: NGUYỄN XUÂN VINH Bài tập: đổi số từ cơ số 10 sang cơ số x void main() { Stack s; int coso, so, sodu; Init(s); // Nhập... 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Stack - Ứng dụng 21 21 GV: NGUYỄN XUÂN VINH 22 Stack - Ứng dụng Thuật toán Ba Lan ngược (Reverse Polish Notation – RPN) 22 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Định nghĩa RPN: Biểu thức toán học trong đó các toán tử được viết sau toán hạng và không dùng dấu ngoặc Phát minh bởi Jan Lukasiewics một nhà khoa học Ba Lan vào những năm 1950 GV: NGUYỄN XUÂN VINH RPN Infix... toán hạng ngay trước toán tử và kết hợp chúng bằng toán tử trên 3 Lặp đi lặp lại cho đến hết biểu thức MÔN: CẤU TRÚC DỮ LIỆU Ví dụ 2 3 4 + 5 6 - - * 12/3/15 → /XX 2*((3+4)-(5-6)) 2 3 4 + 5 6 - - * → 2 7 5 6 - - * → 2 7 5 6 - - * → 2 7 -1 - * → 2 7 -1 - * → 2 8 * → 2 8 * → 24 24 16 GV: NGUYỄN XUÂN VINH 1 Khởi tạo Stack rỗng (chứa hằng hoặc biến) 2 Lặp cho đến khi kết thúc biểu thức: Đọc 01 phần tử của... dịch (thông dịch), khi thực hiện các thủ tục, Stack được sử dụng để lưu môi trường của các thủ tục Lưu dữ liệu khi giải một số bài toán của lý thuyết đồ thị (như tìm đường đi) Khử đệ qui Ứng dụng trong các bài toán tính toán biểu thức … GV: NGUYỄN XUÂN VINH 19 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 19 Stack - Ứng dụng Ví dụ: thủ tục Quick_Sort dùng Stack để khử đệ qui: Bước 1 L=1; R=n; Bước 2 Chọn phần... Queue GV: NGUYỄN XUÂN VINH Queue – Các thao tác MÔN: CẤU TRÚC DỮ LIỆU 34 Hàng đợi hỗ trợ các thao tác: EnQueue(): Thêm đối tượng vào cuối (rear) Queue DeQueue(): Lấy đối tượng ở đầu (front) Queue ra khỏi Queue Ví dụ: 532 4 12/3/15 Front 34 /XX 5 DeQueue Rear 3 2 4 EnQueue GV: NGUYỄN XUÂN VINH Queue – Các thao tác 35 35 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU Queue còn hỗ trợ các thao tác: isEmpty():... MÔN: CẤU TRÚC DỮ LIỆU 12/3/15 /XX 15 Hiện thực Stack dùng DSLK Thêm một phần tử vào ngăn xếp: Tạo ra phần tử mới cho biến next của phần tử này trỏ tới top hiện thời Top bây giờ sẽ là phần tử mới này Lấy một phần tử trong ngăn xếp: Phần tử được lấy chính là top của ngăn xếp Xóa 1 phần tử khỏi ngăn xếp: Top bây giờ là top.next 16 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Thêm ... 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Thêm phần tử 17 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Xóa phần tử GV: NGUYỄN XUÂN VINH 18 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 18 Stack... TRÚC DỮ LIỆU 32 GV: NGUYỄN XUÂN VINH Queue - Khái niệm Imaging 33 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU GV: NGUYỄN XUÂN VINH Các phép toán Queue GV: NGUYỄN XUÂN VINH Queue – Các thao tác MÔN: CẤU TRÚC... GV: NGUYỄN XUÂN VINH Stack - Ứng dụng Bài tập: đổi số từ số 10 sang số x 20 /XX 12/3/15 MÔN: CẤU TRÚC DỮ LIỆU 57 Ví dụ: 57 = ???2 57 = 1110012 28 14 1 GV: NGUYỄN XUÂN VINH Bài tập: đổi