Tin Học KHMT
Ôn tập Tin học THPT › Tin học 11 - Khoa học máy tính › Bài 31
Tin học 11 - Khoa học máy tính

Bài 31. Ngăn xếp và hàng đợi

Cùng là một dãy dữ liệu đang chờ được xử lí, nhưng thứ tự lấy ra có thể theo hai luật hoàn toàn trái ngược nhau: lấy thứ vừa bỏ vào gần nhất, hoặc lấy thứ đã chờ lâu nhất. Bài này giới thiệu hai cấu trúc dữ liệu dựng trên hai luật đó - ngăn xếp và hàng đợi - cùng cách mô phỏng cả hai chỉ bằng danh sách có sẵn của Python, và một lỗi rất hay gặp khi lấy phần tử ra.

Chủ đề F · Lập trình, Thuật toán & CTDL (KHMT) - đọc khoảng 10 phút · 25 câu luyện tập trong ứng dụng

Tương ứng sách giáo khoa
  • Cánh DiềuTin học 11 (Khoa học máy tính) - Chủ đề F(CS) · Bài 15. Cấu trúc dữ liệu danh sách liên kết và ứng dụngtr. 146
Xem bảng đối chiếu cả bộ →

Bắt đầu bằng một hình dung

Sau bữa tối, bạn rửa xong một chồng đĩa và úp chúng lên giá. Chiếc rửa xong sớm nhất nằm dưới cùng, chiếc rửa sau được đặt chồng lên trên. Sáng hôm sau cần lấy một cái đĩa, bạn làm gì? Không ai đi rút chiếc nằm dưới đáy cả - bạn nhấc chiếc trên cùng, tức là chiếc vừa được úp lên sau cùng tối qua. Muốn lấy chiếc ở đáy, bạn buộc phải dỡ hết những chiếc nằm đè lên nó. Chồng đĩa vì thế có một luật ngầm: thứ vào sau lại là thứ ra trước.

Chiều hôm đó, bạn ra siêu thị và đứng vào hàng chờ ở quầy thanh toán. Tại đây luật hoàn toàn ngược lại. Người tới quầy sớm nhất được tính tiền trước rồi rời đi; người vừa tới phải đứng vào cuối hàng và chờ tới lượt. Không ai chen ngang, cũng không ai được phục vụ sớm chỉ vì mới đến.

Hai cách sắp xếp rất đời thường đó - chồng đĩa trên giá và hàng người trước quầy - chính là hai cách máy tính tổ chức những dữ liệu đang xếp hàng chờ xử lí.

Nội dung bài học

  1. 1) Ngăn xếp - vào sau ra trước
  2. 2) Hàng đợi - vào trước ra trước
  3. 3) pop()pop(0) - khác nhau đúng một con số
  4. 4) Hai cấu trúc này nằm ở đâu trong đời sống

Tóm tắt lý thuyết cần nhớ

  • Ngăn xếp (stack) chạy theo luật vào sau ra trước (LIFO): mọi thao tác thêm (push) và lấy (pop) đều diễn ra ở đỉnh (top), không được rút phần tử ở giữa.
  • Hàng đợi (queue) chạy theo luật vào trước ra trước (FIFO): thêm phần tử vào cuối hàng, lấy phần tử ra từ đầu hàng.
  • Danh sách Python mô phỏng được cả hai: ngăn xếp là append() + pop(), hàng đợi là append() + pop(0); nhớ kĩ pop() lấy phần tử cuối, còn pop(0) lấy phần tử đầu.
  • Luôn kiểm tra rỗng bằng len(ds) > 0 trước khi lấy phần tử ra, nếu không Python báo lỗi IndexError và dừng chương trình.
  • Ngăn xếp đứng sau nút Hoàn tác và nút Back của trình duyệt; hàng đợi đứng sau hàng chờ in ấn, việc xếp hàng mua vé và tin nhắn chờ gửi.

Thuật ngữ tiếng Anh trong bài

Tiếng AnhĐọc làNghĩa
stackxờ-TẮCngăn xếp
Cách chứa dữ liệu kiểu 'vào sau ra trước' - giống chồng đĩa: đĩa đặt lên sau cùng lại được lấy ra trước tiên.
queuekiuhàng đợi
Dãy dữ liệu 'vào trước ra trước' - y như xếp hàng mua vé, ai đến trước được trước.
LIFO (Last In, First Out)lai-phâuvào sau ra trước
Luật hoạt động của ngăn xếp: thứ được bỏ vào sau cùng lại là thứ được lấy ra đầu tiên.
FIFO (First In, First Out)phai-phâuvào trước ra trước
Luật hoạt động của hàng đợi: thứ vào trước thì ra trước.
pushpútđẩy vào đỉnh
Thao tác thêm một phần tử lên đỉnh ngăn xếp.
poppốpnhấc ra khỏi đỉnh
Thao tác lấy phần tử ở đỉnh ngăn xếp ra và trả về giá trị của nó.

Câu hỏi trắc nghiệm có đáp án

Mấy câu mẫu để bạn tự kiểm tra ngay. Trong ứng dụng, bài này có đủ 25 câu, chấm điểm tự động và giải thích từng câu sai.

Câu 1 · Nhận biết
Ngăn xếp (stack) hoạt động theo nguyên tắc nào?
  1. Vào trước ra trước - phần tử vào sớm nhất được lấy ra đầu tiên
  2. Vào sau ra trước - phần tử vào sau cùng được lấy ra đầu tiên
  3. Lấy ngẫu nhiên một phần tử bất kì trong ngăn xếp
  4. Luôn lấy phần tử có giá trị nhỏ nhất ra trước
Đáp án: B - Ngăn xếp theo luật vào sau ra trước (LIFO), đúng như chồng đĩa: chiếc úp lên sau cùng nằm trên đỉnh và được nhấc ra đầu tiên. Phương án đầu là luật của hàng đợi (FIFO), không phải ngăn xếp. Hai phương án còn lại đều sai vì ngăn xếp chỉ cho phép thao tác ở đỉnh, không rút phần tử tuỳ ý ở giữa và cũng không quan tâm giá trị lớn hay nhỏ.
Câu 2 · Nhận biết
Trong một hàng đợi (queue), phần tử mới được thêm vào đâu và phần tử được lấy ra nằm ở đâu?
  1. Thêm vào cuối hàng, lấy ra từ đầu hàng
  2. Thêm vào đầu hàng, lấy ra từ đầu hàng
  3. Thêm vào cuối hàng, lấy ra từ cuối hàng
  4. Thêm vào giữa hàng, lấy ra từ cuối hàng
Đáp án: A - Hàng đợi mở hai đầu, mỗi đầu một việc: vào ở cuối, ra ở đầu - giống hàng người chờ thanh toán, ai mới đến thì đứng cuối, ai đứng đầu thì được phục vụ. Phương án 2 và 3 đều dồn cả hai thao tác về một đầu nên phá vỡ luật vào trước ra trước. Phương án 4 sai vì không ai được chen vào giữa hàng.
Câu 3 · Thông hiểu
Đoạn chương trình sau dùng danh sách s làm ngăn xếp. Máy in ra kết quả gì?
s = []
s.append(1)
s.append(2)
s.append(3)
print(s.pop(), s.pop())
  1. 1 2
  2. 3 2
  3. 1 3
  4. 3 1
Đáp án: B - Sau ba lệnh append, danh sách là [1, 2, 3] với đỉnh là 3. Lệnh pop() thứ nhất nhấc đỉnh ra, trả về 3 và danh sách còn [1, 2]; lệnh pop() thứ hai nhấc đỉnh mới, trả về 2. Vậy máy in 3 2. Các phương án bắt đầu bằng 1 đều nhầm ngăn xếp thành hàng đợi (lấy từ đầu), còn 3 1 sai vì sau khi lấy 3 thì đỉnh là 2 chứ không phải 1.
Câu Đúng/Sai (Phần II) · Thông hiểu
Xét các phát biểu sau về ngăn xếp và hàng đợi:
  • a)Trong ngăn xếp, cả thao tác thêm vào lẫn thao tác lấy ra đều diễn ra ở đỉnh.Đúng
  • b)Trong hàng đợi, phần tử vào sau cùng sẽ được lấy ra đầu tiên.Sai
  • c)Gọi pop() trên một danh sách đang rỗng sẽ khiến chương trình báo lỗi IndexError.Đúng
  • d)Có thể lấy một phần tử nằm giữa ngăn xếp mà không cần đụng tới các phần tử nằm trên nó.Sai
Vì sao:
  • (a) Đúng: ngăn xếp chỉ mở một đầu là đỉnh, pushpop đều làm việc tại đó.
  • (b) Sai: “vào sau ra trước” là luật của ngăn xếp; hàng đợi theo luật vào trước ra trước, phần tử vào sau cùng phải đứng cuối và chờ lâu nhất.
  • (c) Đúng: danh sách rỗng không còn gì để lấy nên Python báo IndexError: pop from empty list, vì vậy phải kiểm tra rỗng trước.
  • (d) Sai: muốn lấy phần tử ở giữa, bạn buộc phải pop hết những phần tử nằm trên nó, đúng như phải dỡ đĩa từ trên xuống.

Thử ngay: minh hoạ từng bước

Bấm từng bước để tự xem cơ chế hoạt động, hoặc bấm “Tự chạy” cho nó tiến mỗi giây một lần. Đổi được dữ liệu đầu vào - không cần đăng nhập.

Học trọn bài này trong ứng dụng

Bài giảng đầy đủ, 25 câu luyện tập chấm tự động, thi thử đúng cấu trúc đề tốt nghiệp (24 trắc nghiệm + 4 Đúng/Sai), bài thực hành máy tự chấm và gia sư AI giải thích chỗ sai.

Mở bài 31 trong ứng dụng

Phần học miễn phí, không cần tạo tài khoản.