Giải chuyên đề Tin 12 KNTT Bài 5: Thực hành kiểu dữ liệu ngăn xếp và hàng đợi có đáp án
46 người thi tuần này 4.6 220 lượt thi 4 câu hỏi
🔥 Đề thi HOT:
15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 19 có đáp án
15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 23 có đáp án
15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 24 có đáp án
15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 22 có đáp án
Trắc nghiệm tổng hợp Tin học năm 2023 có đáp án (Phần 4)
15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 25 có đáp án
15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 20 có đáp án
15 câu Trắc nghiệm Tin học 12 Kết nối tri thức Bài 16 có đáp án
Nội dung liên quan:
Danh sách câu hỏi:
Lời giải
Ví dụ thực tế cần sử dụng cả kiểu dữ liệu hàng đợi (queue) và ngăn xếp (stack) là trong việc thực hiện kiểm tra biểu thức số học (arithmetic expression) để xem liệu biểu thức có được viết đúng (well-formed) hay không, đặc biệt là kiểm tra tính đúng đắn của dấu ngoặc.
Ví dụ: Kiểm tra tính đúng đắn của dấu ngoặc trong biểu thức
Giả sử có một biểu thức toán học và bạn muốn kiểm tra xem tất cả các dấu ngoặc mở đều có dấu ngoặc đóng tương ứng và được đặt đúng thứ tự. Để làm điều này, bạn có thể sử dụng ngăn xếp và hàng đợi như sau:
1. Ngăn xếp (Stack): Dùng để theo dõi các dấu ngoặc mở.
2. Hàng đợi (Queue): Dùng để lưu trữ biểu thức đã phân tích và kiểm tra trong trường hợp bạn cần lưu trữ và xử lý lại sau khi kiểm tra dấu ngoặc.
Cách thực hiện như sau:
1. Duyệt qua từng ký tự trong biểu thức:
- Nếu gặp dấu ngoặc mở ((, [, {), đưa vào ngăn xếp.
- Nếu gặp dấu ngoặc đóng (), ], }), kiểm tra ngăn xếp để đảm bảo dấu ngoặc đóng tương ứng với dấu ngoặc mở tương ứng. Nếu đúng, loại bỏ dấu ngoặc mở khỏi ngăn xếp.
2. Sau khi duyệt qua tất cả các ký tự:
- Nếu ngăn xếp trống, biểu thức có dấu ngoặc đúng.
- Nếu ngăn xếp không trống, biểu thức có dấu ngoặc không đúng.
Lời giải
Đầu tiên, viết chương trình để đọc dữ liệu từ hai tệp input1.inp và input2.inp, sau đó mô phỏng quá trình phục vụ suất ăn. Dưới đây là gợi ý chương trình hoàn chỉnh mẫu:
from queue import Queue
from collections import deque
# Định nghĩa lớp Stack sử dụng deque cho ngăn xếp
class Stack:
def __init__(self):
self.items = deque()
def is_empty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
if not self.is_empty():
return self.items.pop()
return None
def size(self):
return len(self.items)
def bepan(dangkiga, dangkibo, suatan):
doimon = [] # list chứa ID những người phải đổi món
while not suatan.is_empty():
tmp = suatan.pop()
if tmp == "bò": # nếu suất ăn lấy ra là bò
if not dangkibo.empty(): # còn người đăng kí suất ăn bò
dangkibo.get()
else:
ID_doi = dangkiga.get()
doimon.append(ID_doi)
elif tmp == "gà": # nếu suất ăn lấy ra là gà
if not dangkiga.empty(): # còn người đăng kí suất ăn gà
dangkiga.get()
else:
ID_doi = dangkibo.get()
doimon.append(ID_doi)
return doimon
# Khởi tạo hàng đợi cho cơm gà và cơm bò
dangkiga = Queue()
dangkibo = Queue()
# Khởi tạo ngăn xếp cho các suất ăn
suatan = Stack()
# Đọc thông tin đăng kí và đưa vào 2 queue
with open("input1.inp", "r", encoding="utf8") as file1:
for line in file1.readlines():
id, dangki = line.strip().split()
if dangki == "gà":
dangkiga.put(id)
elif dangki == "bò":
dangkibo.put(id)
# Đọc thông tin suất ăn và đưa vào ngăn xếp
with open("input2.inp", "r", encoding="utf8") as file2:
data = file2.read().strip().split()
for item in data:
suatan.push(item)
doimon = bepan(dangkiga, dangkibo, suatan)
if len(doimon) == 0:
print("Không có người nào phải đổi món ăn")
else:
print("Danh sách những người phải đổi món là:", doimon)
- Nhận xét về vị trí của những người phải đổi món ăn
Sau khi chạy chương trình với nhiều trường hợp dữ liệu đầu vào khác nhau, nhận xét về vị trí của những người phải đổi món ăn:
- Những người phải đổi món ăn luôn nằm trong hàng đợi ban đầu của loại suất ăn còn lại khi loại suất ăn họ đăng ký đã được phục vụ hết.
- Vị trí của những người phải đổi món ăn phụ thuộc vào thứ tự của họ trong hàng đợi. Người đầu tiên trong hàng đợi sẽ phải đổi món trước khi đến lượt họ nếu hàng đợi của suất ăn còn lại đã hết.
Lời giải
Để tính toán thời gian chờ đợi trung bình cần theo dõi thời gian chờ của mỗi người. Dưới đây là chương trình mở rộng để tính toán thời gian chờ đợi trung bình.
def bepan_with_wait_time(dangkiga, dangkibo, suatan):
doimon = [] # list chứa ID những người phải đổi món
wait_times = {}
current_time = 0
while not suatan.is_empty():
current_time += 1 # Mỗi lượt lấy suất ăn là 1 giây
tmp = suatan.pop()
if tmp == "bò": # nếu suất ăn lấy ra là bò
if not dangkibo.empty(): # còn người đăng kí suất ăn bò
id = dangkibo.get()
wait_times[id] = current_time
else:
id = dangkiga.get()
doimon.append(id)
wait_times[id] = current_time
elif tmp == "gà": # nếu suất ăn lấy ra là gà
if not dangkiga.empty(): # còn người đăng kí suất ăn gà
id = dangkiga.get()
wait_times[id] = current_time
else:
id = dangkibo.get()
doimon.append(id)
wait_times[id] = current_time
return doimon, wait_times
# Đọc thông tin đăng kí và đưa vào 2 queue
dangkiga = Queue()
dangkibo = Queue()
with open("input1.inp", "r", encoding="utf8") as file1:
for line in file1.readlines():
id, dangki = line.strip().split()
if dangki == "gà":
dangkiga.put(id)
elif dangki == "bò":
dangkibo.put(id)
# Đọc thông tin suất ăn và đưa vào ngăn xếp
suatan = Stack()
with open("input2.inp", "r", encoding="utf8") as file2:
data = file2.read().strip().split()
for item in data:
suatan.push(item)
doimon, wait_times = bepan_with_wait_time(dangkiga, dangkibo, suatan)
if len(doimon) == 0:
print("Không có người nào phải đổi món ăn")
else:
print("Danh sách những người phải đổi món là:", doimon)
# Tính toán thời gian chờ đợi trung bình
if wait_times:
total_wait_time = sum(wait_times.values())
average_wait_time = total_wait_time / len(wait_times)
print(f"Thời gian chờ đợi trung bình là: {average_wait_time:.2f} giây")
else:
print("Không có thời gian chờ đợi nào được tính toán.")Lời giải
Bạn cần đăng ký gói VIP ( giá chỉ từ 199K ) để làm bài, xem đáp án và lời giải chi tiết không giới hạn.
44 Đánh giá
50%
40%
0%
0%
0%