Bài giảng trình bày nội dung chi tiết về các thao tác với ngăn xếp và hàng đợi trong một chương trình lập trình. Mời các bạn cùng tham khảo để bổ sung thêm kiến thức, nâng cao thêm kỹ năng lập trình của mình.
11/22/2016 Kỹ thuật lập trình Tuần 12 - Ngăn xếp & Hàng đợi Giáo viên: Hà Đại Dương duonghd@mta.edu.vn 11/22/2016 Bài trước Kiểu có cấu trúc (structure) Danh sách liên kết (linked list) Ngăn xếp (Stack) Hàng đợi (Queue) 11/22/2016 Ngăn xếp - Stack 11/22/2016 11/22/2016 Khái quát • Là dạng danh sách “đặc biệt”: Việc thêm (phần tử) vào lấy (phần tử) làm đỉnh ngăn xếp • Để tạo ngăn xếp: – Có thể dùng Mảng (Sinh viên tự nghiên cứu, BTVN) – Có thể dùng danh sách liên kết 11/22/2016 Các thao tác với ngăn xếp • • • • • • Khai báo Khởi tạo (init) Kiểm tra ngăn xếp rỗng (isEmpty) Thêm phần tử vào (push) Lấy phần tử (pop) Lấy giá trị phần tử đỉnh (get) 11/22/2016 Khai báo • Cấu trúc dạng ghi tự trỏ • Khai báo biến 11/22/2016 11/22/2016 Vấn đề • Biến mơ tả stack trỏ • Chúng ta dùng tham số thực cho hàm dạng biến thường, muốn trả giá trị cho tham số tham số hình thức cần khai báo dạng trỏ tham chiếu • Cần truyền tham số thực dạng trỏ cho hàm làm nào? -> Con trỏ (hoặc tham chiếu??) 11/22/2016 Hàm với dạng tham số đầu vào Gọi hàm Ba cách khai báo tham số Tham trị a, b không đổi Con trỏ 11/22/2016 Tham chiếu Khởi tạo • Khởi tạo giá trị cuối để biết điểm kết thúc ngăn xếp đâu Giá trị thường chọn NULL • Hàm init() 11/22/2016 11/22/2016 Kiểm tra ngăn xếp rỗng • Kiểm tra xem đến đáy ngăn xếp hay chưa • Hàm isEmpty() 11/22/2016 10 Thêm phần tử vào (push) • Thêm phần tử vào đỉnh ngăn xếp • Hàm push() 11/22/2016 11 Lấy phần tử (pop) • Lấy phần tử đỉnh ngăn xếp • Hàm pop() 11/22/2016 12 11/22/2016 Ví dụ - Đảo ngược xâu • Đảo ngược xâu ký tự, ví dụ đảo ngược HELLO OLLEH • Cách làm: Lấy ký tự xâu vào theo thứ tự từ trái qua phải đẩy (push) vào ngăn xếp Lần lượt lấy ký tự khỏi ngăn xếp -> Được xâu đảo ngược 11/22/2016 13 Ví dụ … 11/22/2016 14 Ví dụ - Tính giá trị BT hậu tố • Biểu thức trung tố: a+b a+b*c • Biểu thức hậu tố: ab+ abc*+ 11/22/2016 15 11/22/2016 Ví dụ … Có biểu thức: 253*+ (dạng trung tố: 2+5*3) • Tư tưởng: Tính giá trị biểu thức hậu tố: – Đọc từ trái sang phải • Nếu gặp tốn hạng đưa vào stack • Nếu gặp tốn tử (2 ngơi) lấy hai giá trị cuối stack, thực phép toán Đưa giá trị tính vào stack – Lặp đến hết chuỗi giá trị lại cuối stack giá trị biểu thức 11/22/2016 16 Ví dụ … • Làm bước với biểu thức: 253*+ • Thế toán hạng? • Thế tốn tử? • Viết chương trình (15 phút) 11/22/2016 17 11/22/2016 18 11/22/2016 11/22/2016 19 11/22/2016 20 Ví dụ - BT trung tố -> hậu tốt • Đã tính giá trị biểu thức hậu tố • Nếu chuyển từ trung tố-> hậu tố ta tính biểu thức viết theo cách thơng thường (trung tố) 11/22/2016 21 11/22/2016 Ví dụ … • Có biểu thức: 2+5*3 2*5+3 • Ý tưởng thuật toán: – Duyệt từ trái sang gặp: • Toán hạng: đưa chuỗi (mảng) đầu • Toán tử: – Nếu “lớn” toán tử stack đưa vào stack – Nếu “bé” lấy tốn tử stack vào chuỗi đầu đến gặp toán tử lớn hơn; Đưa toán tử vào stack – Hết chuỗi, lấy toàn tốn tử đưa chuỗi đầu 11/22/2016 22 Ví dụ … • So sánh phép tốn: (*,/) > (+,-) • Làm bước với 2+5*3 2*5+3 • Với stack toán cần lấy giá trị (mà khơng xố) phần tử đỉnh stack để so sánh Hàm get() 11/22/2016 23 Ví dụ … • Viết chương trình (15 phút) 11/22/2016 24 11/22/2016 Ví dụ - Trong BT có dấu () • Biểu thức có dấu ( ) • Làm bình thường với số sửa đổi: – Duyệt từ trái sang gặp: • Tốn hạng: đưa chuỗi (mảng) đầu • Tốn tử: – Nếu “lớn” tốn tử stack đưa vào stack – Nếu “bé” lấy tốn tử stack vào chuỗi đầu đến gặp toán tử lớn hơn; Đưa toán tử vào stack – Nếu (: đẩy ( vào stack – Nếu ): lấy toán tử stack vào chuỗi đầu gặp ( (Không đưa ( ) vào chuỗi đầu ra) 11/22/2016 25 Ví dụ … • Làm bước với 2+(5+3)*4 Kết quả: 2,5,3,+,4,*,+ • Viết chương trình (15 phút) 11/22/2016 26 Ví dụ - Tính giá trị biểu thức • • • • (Ngầm hiểu biểu thức BT trung tố) Chuyển BT trung tố -> Hậu tố (1 hàm) Tính giá trị BT hậu tố (1 hàm) Tạm giả thiết rằng: Mỗi toán hạng (và toán tử) ký tự Viết chương trình (15 phút) 11/22/2016 27 11/22/2016 Ví dụ - Tính giá trị biểu thức • Tốn hạng có nhiều chữ số • Ví dụ biểu thức: 123+(64-31)*32+1000 • Thực hiện: Chuyển BT dạng hậu tố BTHT (1 mảng) Tính giá trị biểu thức hậu tố BTHT 11/22/2016 28 Hàng đợi - Queue 11/22/2016 29 Khái quát • Là dạng danh sách “đặc biệt”: Thêm (phần tử) vào cuối lấy (phần tử) đầu hàng đợi • Để tạo hàng đợi: – Có thể dùng Mảng (Sinh viên tự nghiên cứu, BTVN) – Có thể dùng danh sách liên kết 11/22/2016 30 10 11/22/2016 Khái quát … • Dùng trỏ: – Con trỏ head: lấy – Con trỏ tail: đẩy giá trị vào 11/22/2016 31 Các thao tác với hàng đợi • • • • • Khai báo Khởi tạo (init) Kiểm tra hàng đợi rỗng (isEmpty) Thêm phần tử vào (put) Lấy phần tử (get) 11/22/2016 32 Khai báo • Khai báo cấu trúc • Khai báo biến 11/22/2016 33 11 11/22/2016 Khởi tạo • Khởi tạo giá trị cuối để biết điểm kết thúc hàng đợi đâu Giá trị thường chọn NULL • Hàm init() 11/22/2016 34 Kiểm tra hàng đợi rỗng • Kiểm tra xem hết phần tử hàng đợi hay chưa • Hàm isEmpty() 11/22/2016 35 Thêm phần tử vào (put) • Thêm phần tử vào hàng đợi • Hàm put() 11/22/2016 36 12 11/22/2016 11/22/2016 37 Lấy phần tử (get) • Lấy phần tử đầu hàng đợi • Hàm get() 11/22/2016 38 Ví dụ - Duyệt xâu ký tự • Duyệt xâu ký tự • Cách làm: Lấy ký tự xâu vào theo thứ tự từ trái qua phải đẩy (put) vào hàng đợi Lần lượt lấy ký tự khỏi hàng đợi 11/22/2016 39 13 11/22/2016 11/22/2016 40 Ứng dụng • Có thể dùng stack, queue để tránh đệ qui • Một số tốn: – Duyệt đồ thị • Stack: Duyệt theo chiều sâu • Queue: Duyệt theo chiều rộng – Tơ màu vùng với biên xác định –… 11/22/2016 41 Bài tập 11/22/2016 42 14 11/22/2016 Bài tập Viết chương trình tách tốn hạng, tốn tử, dấu mở đóng ngoặc xâu biểu thức (trung tố) Viết chương trình tính giá trị biểu thức nhập từ bàn phím Lưu ý tốn hạng có nhiều chữ số Sử dụng queue giải tốn tơ màu Sử dụng stack giải tốn tơ màu 11/22/2016 43 Bài tập nhà Cài đặt thao tác cho ngăn xếp sử dụng mảng Cài đặt thao tác cho hàng đợi sử dụng mảng Đề xuất thuật toán, viết chương trình kiểm tra xem xâu ký tự có viết cú pháp hay khơng? 11/22/2016 44 15 ... trị cuối để biết điểm kết thúc hàng đợi đâu Giá trị thường chọn NULL • Hàm init() 11/22/2016 34 Kiểm tra hàng đợi rỗng • Kiểm tra xem hết phần tử hàng đợi hay chưa • Hàm isEmpty() 11/22/2016 35... hậu tố BTHT 11/22/2016 28 Hàng đợi - Queue 11/22/2016 29 Khái quát • Là dạng danh sách “đặc biệt”: Thêm (phần tử) vào cuối lấy (phần tử) đầu hàng đợi • Để tạo hàng đợi: – Có thể dùng Mảng (Sinh... • Hàm init() 11/22/2016 11/22/2016 Kiểm tra ngăn xếp rỗng • Kiểm tra xem đến đáy ngăn xếp hay chưa • Hàm isEmpty() 11/22/2016 10 Thêm phần tử vào (push) • Thêm phần tử vào đỉnh ngăn xếp • Hàm