Ngăn xếp stack• Một danh sách theo kiểu vào sau ra trước LIFO Last In First Out • Các thao tác chỉ xảy ra ở đỉnh ngăn xếp topOfStack... Cài đặt ngăn xếp 1• Bằng danh sách liên kết đơn: •
Trang 1Ngăn xếp & Hàng đợi (Stack & Queue)
Nguyễn Mạnh Hiển
Khoa Công nghệ thông tin
hiennm@tlu.edu.vn
Trang 2Ngăn xếp (stack)
• Một danh sách theo kiểu vào sau ra trước
LIFO (Last In First Out)
• Các thao tác chỉ xảy ra ở đỉnh ngăn xếp (topOfStack)
Trang 3Cài đặt ngăn xếp (1)
• Bằng danh sách liên kết đơn:
• Các thao tác:
− push: chèn vào đầu danh sách (push_front)
− pop: xóa khỏi đầu danh sách (pop_front)
− top: truy nhập phần tử ở đầu danh sách (front) head
Trang 4Cài đặt ngăn xếp (2)
• Cài đặt bằng mảng (theArray):
• push: topOfStack++, theArray[topOfStack] = x
• pop:
topOfStack • top: return theArray[topOfStack]
• Chú ý khi ngăn xếp rỗng: topOfStack = -1
theArray topOfStack = 3
0 1 2 3 4 5 6 7 8
Trang 5Các ứng dụng của ngăn xếp
• Cân bằng ký hiệu trong mã nguồn, cân bằng thẻ (trong một trang HTML)
• Định giá biểu thức hậu tố
• Chuyển biểu thức từ trung tố sang hậu tố
• Tổ chức các lời gọi hàm
Trang 14Định giá biểu thức hậu tố
• Ví dụ: cần định giá biểu thức (trung tố) sau:
4,99 1,06 ∗ 5,99 + 6,99 1,06 ∗ +
Trang 15Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Quy tắc:
− Gặp toán hạng đặt vào ngăn xếp
− Gặp toán tử lấy hai toán hạng ra khỏi
ngăn xếp và áp dụng toán tử đặt kết quả trở lại ngăn xếp
Trang 16Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đặt bốn toán hạng đầu vào ngăn xếp
Trang 17Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “+”, lấy 3 và 2 ra, cộng lại được 5 và đặt 5 vào ngăn xếp
Trang 18Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đặt 8 vào ngăn xếp
Trang 19Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “∗”, lấy ra 8 và 5, nhân vào được 40 và đặt vào ngăn xếp
Trang 20Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “+”, lấy ra 40 và 5, cộng lại được 45 và đặt vào ngăn xếp
Trang 21Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đặt 3 vào ngăn xếp
Trang 22Định giá: 6 5 2 3 + 8 ∗ + 3 + ∗
• Đọc “+”, lấy ra 3 và 45, cộng lại được 48 và đặt vào ngăn xếp
Trang 24Chuyển biểu thức từ trung tố sang hậu tố
Đọc thêm trong sách!
Trang 25Ngăn xếp thời gian chạy
• Môi trường thời gian chạy:
− Bộ nhớ tĩnh (static):
• Mã thực thi
• Các biến toàn cục
− Ngăn xếp (stack):
• push cho mỗi lời gọi hàm
• pop cho mỗi lần hàm trở về (return)
bộ nhớ chương trình
Trang 26Hàng đợi (queue)
• Một danh sách theo kiểu vào trước ra trước
FIFO (First In First Out)
• Hai thao tác cơ bản:
− enqueue: chèn phần tử vào cuối danh sách
− dequeue: xóa phần tử ở đầu danh sách
Trang 27Cài đặt hàng đợi
• Như trường hợp ngăn xếp, có thể dùng mảng hoặc danh sách liên kết để cài đặt hàng đợi
• Các thao tác đều rất nhanh: O(1)
• Ở đây chúng ta chỉ xem xét cài đặt bằng mảng:
theArray
currentSize = 4
Trang 28Cài đặt hàng đợi bằng mảng
• Hàng đợi này chỉ chứa được 10 phần tử nhanh chóng đầy !
thực tế hàng đợi thường chỉ cần nhỏ nếu các thao tác
enqueue và dequeue xảy ra thường xuyên
• Sau 10 lần enqueue, back ở vị trí cuối cùng không thể
enqueue thêm giải pháp mảng vòng tròn !
theArray
currentSize = 4
Trang 29Mảng vòng tròn
Trạng thái ban đầu
Sau enqueue(1)
Trang 30Mảng vòng tròn
Sau dequeue (trả về 2) Sau enqueue(3)
Trang 31Mảng vòng tròn
Sau dequeue (trả về 1) Sau dequeue (trả về 4)
Trang 32Mảng vòng tròn
Chú ý: hàng đợi rỗng khi currentSize = 0
Sau dequeue (trả về 3)
Trang 33Ứng dụng của hàng đợi
• Xếp vào hàng đợi các tác vụ in ấn khi gửi tới
máy in
• Các cuộc gọi tới một công ty khi tất cả các
nhân viên trực đều bận
• Các gói tin gửi từ nguồn tới đích, được xếp vào hàng đợi để chờ xử lý