Bài giảng Cấu trúc dữ liệu và giải thuật: Ngăn xếp và hàng đợi cung cấp cho người học các kiến thức về ngăn xếp, cài đặt ngăn xếp, các ứng dụng của ngăn xếp, định giá biểu thức hậu tố, ngăn xếp thời gian chạy, cài đặt hàng đợi,... Mời các bạn cùng tham khảo nội dung chi tiết.
Ngăn xếp Hàng đợi (Stacks and Queues) Nguyễn Mạnh Hiển hiennm@tlu.edu.vn Nội dung Ngăn xếp Hàng đợi Ngăn xếp Ngăn xếp • Một danh sách phần tử theo kiểu vào sau trước: LIFO (Last In First Out) • Ba thao tác chính, xảy đỉnh ngăn xếp thời gian O(1): − push: Thêm phần tử − pop: Xóa phần tử − top: Trả phần tử (pop top kết hợp thành thao tác) • Các thao tác khác: − Lấy kích thước − Kiểm tra rỗng Cài đặt ngăn xếp – cách • Cài đặt danh sách liên kết đơn: head • Cài đặt thao tác: − push(e): Gọi thao tác pushFront(e) DSLK đơn − pop: Gọi thao tác popFront DSLK đơn − top: Gọi thao tác front DSLK đơn Cài đặt ngăn xếp – cách • Cài đặt mảng: theArray 5 topOfStack (= 3) • Cài đặt thao tác: − push(e): topOfStack++, theArray[topOfStack] = e − pop: topOfStack-− top: return theArray[topOfStack] Một số ứng dụng ngăn xếp • Cân thẻ (tag) trang HTML • Định giá biểu thức hậu tố • Ngăn xếp lời gọi hàm (xem sách) Cân thẻ trang HTML Kiểm tra hai yêu cầu sau đây: Mỗi thẻ mở phải có thẻ đóng tương ứng: something Hai cặp thẻ khác lồng không bắt chéo nhau: something OK something Lỗi Ban đầu ngăn xếp rỗng 10 Gặp thẻ mở, thêm vào ngăn xếp 22 6523+8∗+3+∗ • Đọc “+”, lấy 40 ra, cộng lại 45, đặt 45 vào ngăn xếp 23 6523+8∗+3+∗ • Đặt vào ngăn xếp 24 6523+8∗+3+∗ • Đọc “+”, lấy 45 ra, cộng lại 48, đặt 48 vào ngăn xếp 25 6523+8∗+3+∗ • Đọc “∗”, lấy 48 ra, nhân vào 288, đặt 288 vào ngăn xếp • Khi quét hết biểu thức, giá trị cịn lại ngăn xếp (288) giá trị tính biểu thức Thời gian định giá biểu thức hậu tố O(n), với n số tốn hạng tốn tử có biểu thức 26 Hàng đợi 27 Hàng đợi • Một danh sách phần tử theo kiểu vào trước trước: FIFO (First In First Out) • Hai thao tác chính, thời gian O(1): − enqueue: Chèn phần tử vào cuối danh sách − dequeue: Xóa phần tử đầu danh sách dequeue đầu e enqueue(e) cuối 28 Cài đặt hàng đợi • Như trường hợp ngăn xếp, ta dùng mảng danh sách liên kết đơn để cài đặt hàng đợi • Ở đây, ta xem xét cách cài đặt dùng mảng: − theArray mảng chứa phần tử; − currentSize số phần tử có hàng đợi; − front back giữ vị trí phần tử đầu cuối hàng đợi; vị trí nằm khoảng từ đến chiều dài mảng trừ theArray currentSize = 29 Cài đặt hàng đợi dùng mảng theArray currentSize = • enqueue(e): back++, theArray[back] = e, currentSize++ • dequeue: front++, currentSize-• Hàng đợi chứa 10 phần tử nhanh chóng đầy? − Trên thực tế, hàng đợi thường cần nhỏ dequeue xảy thường xuyên nhằm loại dần phần tử khỏi hàng đợi • Dù vậy, sau 10 lần enqueue, back vị trí cuối khơng thể enqueue thêm giải pháp mảng vòng tròn 30 Mảng vòng tròn Trạng thái ban đầu Sau enqueue(1) 31 Mảng vòng tròn Sau enqueue(3) Sau dequeue (trả 2) 32 Mảng vòng tròn Sau dequeue (trả 4) Sau dequeue (trả 1) 33 Mảng vòng tròn Sau dequeue (trả 3) Chú ý: Vì front nằm trước sau back, nên biết hàng đợi rỗng vào front back phải kiểm tra currentSize! 34 Một số ứng dụng hàng đợi • Xếp tác vụ in ấn vào hàng đợi chúng gửi tới máy in − Trên thực tế, ta hủy tác vụ in nằm hàng đợi hàng đợi nghĩa! • Xếp gọi tới tổng đài chăm sóc khách hàng vào hàng đợi tất nhân viên tổng đài bận • Xếp gói tin gửi từ nguồn tới đích (trong mạng máy tính) vào hàng đợi (ở đích) để chờ xử lý 35 Bài tập Nêu cách thực thao tác lấy kích thước kiểm tra rỗng ngăn xếp trường hợp sau: (a) Cài đặt ngăn xếp danh sách liên kết đơn (b) Cài đặt ngăn xếp mảng Đề xuất cách thực hai ngăn xếp dùng chung mảng Đề xuất cấu trúc liệu hỗ trợ hai thao tác push pop, trường hợp ngăn xếp, hỗ trợ thêm thao tác findMin trả phần tử nhỏ thời gian O(1) 36 Bài tập Xét hàng đợi kiểu mảng vòng tròn Hãy dãy thao tác enqueue dequeue phải thực để chuyển hàng đợi từ trạng thái sang trạng thái 2: (1) 12 35 front back (2) 17 18 35 26 back front Nêu cách thực hàng đợi dùng danh sách liên kết đơn ... Ban đầu ngăn xếp rỗng 10 Gặp thẻ mở, thêm vào ngăn xếp 11 Gặp thẻ mở, thêm vào ngăn xếp 12 Gặp thẻ mở, thêm vào ngăn xếp 13 Gặp nội dung, khơng làm 14 Gặp thẻ đóng, lấy thẻ khỏi ngăn xếp, xem... toán hạng vào ngăn xếp 19 6523+8∗+3+∗ • Đọc “+”, lấy ra, cộng lại 5, đặt vào ngăn xếp 20 6523+8∗+3+∗ • Đặt vào ngăn xếp 21 6523+8∗+3+∗ • Đọc “∗”, lấy ra, nhân vào 40, đặt 40 vào ngăn xếp 22... 45 vào ngăn xếp 23 6523+8∗+3+∗ • Đặt vào ngăn xếp 24 6523+8∗+3+∗ • Đọc “+”, lấy 45 ra, cộng lại 48, đặt 48 vào ngăn xếp 25 6523+8∗+3+∗ • Đọc “∗”, lấy 48 ra, nhân vào 288, đặt 288 vào ngăn xếp