Chuyên đề Tin học 12 Bài 2 (Cánh diều): Kiểu dữ liệu ngăn xếp
Với giải bài tập Chuyên đề Tin học 12 Bài 2: Kiểu dữ liệu ngăn xếp sách Cánh diều hay nhất, chi tiết giúp học sinh dễ dàng làm bài tập Chuyên đề học tập Tin học 12 Bài 2.
Giải Chuyên đề Tin học 12 Bài 2: Kiểu dữ liệu ngăn xếp
Khởi động trang 12 Chuyên đề Tin học 12: Lan xếp các đĩa CD thành một cọc (Hình 1). Mỗi lần lấy đĩa ra khỏi cọc, Lan sẽ lấy lần lượt tùng đĩa một từ trên xuống. Mỗi lần bổ sung. Lan cũng lần lượt xếp từng đĩa mới vào cọc. Em hãy:
a) Cho biết với đĩa nằm ở đáy và đĩa nằm ở đỉnh cọc, đĩa nào được thêm vào cọc trước.
b) So sánh quy tắc thực hiện thao tác thêm vào và lấy đĩa ra khỏi cọc với thao tác thêm vào và lấy ra phần tử khỏi hàng đợi đã được học ở bài trước.
Lời giải:
Lan xếp các đĩa CD thành một cọc (Hình 1). Mỗi lần lấy đĩa ra khỏi cọc, Lan sẽ lấy lần lượt tùng đĩa một từ trên xuống. Mỗi lần bổ sung. Lan cũng lần lượt xếp từng đĩa mới vào cọc.
a) Theo nguyên tắc LIFO thì đĩa nào được thêm vào cọc sau cùng thì sẽ được lấy ra đầu tiên. Đĩa nằm ở đáy là đĩa được thêm vào cọc đầu tiên. Đĩa nằm ở đỉnh cọc là đĩa được thêm vào cọc sau cùng. Như vậy, đĩa nằm ở đáy cọc được thêm vào trước so với đĩa nằm ở đỉnh cọc.
b) So sánh quy tắc thực hiện thao tác thêm vào và lấy đĩa ra khỏi cọc (stack) với thao tác thêm vào và lấy ra phần tử khỏi hàng đợi (queue) như sau:
* Quy tắc hoạt động:
1. Stack (Cọc):
- Thêm vào (Push): Thêm phần tử vào đỉnh của cọc.
- Lấy ra (Pop): Lấy phần tử từ đỉnh của cọc.
- Quy tắc: LIFO (Last In, First Out) - phần tử được thêm vào sau cùng sẽ được lấy ra đầu tiên.
2. Queue (Hàng đợi):
- Thêm vào (Enqueue): Thêm phần tử vào cuối hàng đợi.
- Lấy ra (Dequeue): Lấy phần tử từ đầu hàng đợi.
- Quy tắc: FIFO (First In, First Out) - phần tử được thêm vào đầu tiên sẽ được lấy ra đầu tiên.
* So sánh:
- Thao tác thêm:
+ Stack: Thêm vào đỉnh cọc (mới nhất).
+ Queue: Thêm vào cuối hàng đợi (mới nhất).
- Thao tác lấy ra:
+ Stack: Lấy từ đỉnh cọc (mới nhất).
+ Queue: Lấy từ đầu hàng đợi (cũ nhất).
Hoạt động 1 trang 13 Chuyên đề Tin học 12: Cho dãy A gồm 10 số nguyên lẻ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19. Bạn Thái sẽ thực hiện một cách tuỳ ý các thao tác thêm vào và lấy ra trên ngăn xếp S ban đầu đang không có phần tử nào. Các thao tác thêm vào sẽ lấy ra lần lượt từng số trong dãy A để bổ sung vào ngăn xếp. Em hãy:
a) Vẽ ngăn xếp S thu được sau khi Thái thực hiện hai thao tác thêm vào liên tiếp và một thao tác lấy ra.
b) Cho biết Thái cần thực hiện những thao tác thêm vào và lấy ra theo thứ tự như thế nào để có thể thu được ngăn xếp S như ở Hình 3.
Lời giải:
a) Giả sử chúng ta bắt đầu với một ngăn xếp rỗng SSS và dãy số nguyên lẻ A= [1,3,5,7,9,11,13,15,17,19]
A = [1,3,5,7,9,11,13,15,17,19]
A= [1,3,5,7,9,11,13,15,17,19].
Bạn Thái thực hiện hai thao tác thêm vào liên tiếp và một thao tác lấy ra:
1. Thêm vào 1: Ngăn xếp SSS: 111
2. Thêm vào 3: Ngăn xếp SSS: 1,3 1, 3 1,3
3. Lấy ra: Lấy ra 3 từ ngăn xếp SSS: 111
Như vậy, sau khi thực hiện hai thao tác thêm vào liên tiếp và một thao tác lấy ra, ngăn xếp SSS sẽ là [1][1][1].
Hoạt động 2 trang 14 Chuyên đề Tin học 12: Để cài đặt ngăn xếp với hai thao tác thêm vào (push) và lấy ra (pop), ta có thể dùng mảng một chiều. Khi đó, các phần tử trong mảng sẽ là các phần tử đang có trong ngăn xếp.
Ví dụ: Ngăn xếp S ở Hình 4a có thể được biểu diễn bởi một mảng một chiều mô phỏng như ở Hình 4b. Các phần tử trong mảng theo thứ tự từ đầu đến cuối sẽ tương ứng với các phần tử trong ngăn xếp theo thứ tự từ đáy lên đỉnh. Em hãy vẽ ngăn xếp S và xác định các giá trị tương ứng trong mảng mỗi khi thực hiện xong một thao tác của dãy lần lượt ba thao tác sau:
- Thêm vào ngăn xếp S một phần tử có giá trị 13.
- Thêm vào ngăn xếp S một phần tử có giá trị 15.
- Lấy ra một phần tử khỏi ngăn xếp S.
Lời giải:
Để cài đặt ngăn xếp với hai thao tác thêm vào (push) và lấy ra (pop), ta có thể dùng mảng một chiều. Khi đó, các phần tử trong mảng sẽ là các phần tử đang có trong ngăn xếp. Ngăn xếp S ở Hình 4a có thể được biểu diễn bởi một mảng một chiều mô phỏng như ở Hình 4b. Các phần tử trong mảng theo thứ tự từ đầu đến cuối sẽ tương ứng với các phần tử trong ngăn xếp theo thứ tự từ đáy lên đỉnh.
1. Thêm vào 13: Ngăn xếp SSS và mảng:
Ngăn xếp: [13,11,9,5,1] [13, 11, 9, 5, 1] [13,11,9,5,1]
Mảng:
Chỉ số |
0 |
1 |
2 |
3 |
4 |
Giá trị |
1 |
5 |
9 |
11 |
13 |
2. Thêm vào 15: Ngăn xếp SSS và mảng:
Ngăn xếp: [15,13,11,9,5,1] [15, 13, 11, 9, 5, 1] [15,13,11,9,5,1]
Mảng:
Chỉ số |
0 |
1 |
2 |
3 |
4 |
5 |
Giá trị |
1 |
5 |
9 |
11 |
13 |
15 |
3. Lấy ra 15: Ngăn xếp SSS và mảng:
Ngăn xếp: [13,11,9,5,1] [13, 11, 9, 5, 1] [13,11,9,5,1]
Mảng:
Chỉ số |
0 |
1 |
2 |
3 |
4 |
Giá trị |
1 |
5 |
9 |
11 |
13 |
Thực hành trang 16 Chuyên đề Tin học 12: Em hãy:
a) Đọc hàm pop(S) ở Hình 8 và cho biết dấu ? cần được thay bằng gì.
b) Đọc chương trình ở Hình 9 và cho biết kết quả thu được khi chạy chương trình.
c) Bổ sung hai câu lệnh temp=pop(stack) giống nhau vào cuối đoạn chương trình ở Hình 9 và cho biết kết quả thu được khi chạy chương trình.
d) Viết hàm isEmptyStack(S) với tham số truyền vào là ngăn xếp S. Hàm trả về giá trị True nếu ngăn xếp S đang rỗng không chứa phần tử nào, ngược lại hàm trả về giá trị False.
e) Sửa lại chương trình thu được khi thực hiện xong câu c) như sau: Thay mỗi câu lệnh temp = pop(stack) thành đoạn chương trình ở Hình 10. Cho biết kết quả thu được khi chạy chương trình.
Lời giải:
a) Trong Hình 8, dấu ? trong hàm pop(S) cần được thay bằng lệnh để loại bỏ và trả về phần tử cuối cùng của danh sách S (giả sử S đại diện cho một ngăn xếp). Ví dụ:
def pop(S): return S.pop()
b) Chương trình trong Hình 9 khi chạy sẽ tạo ra một ngăn xếp, đẩy số 2 và 4 vào ngăn xếp, sau đó lấy ra một phần tử và cuối cùng in ra "Phần tử đầu của stack là 4".
c) Nếu bổ xung hai câu lệnh temp=pop(stack) vào cuối chương trình trong Hình 9, chương trình sẽ cố gắng lấy ra hai phần tử nữa từ ngăn xếp. Sau khi lấy ra '4', chỉ còn '2' trong ngăn xếp. Lệnh pop đầu tiên sẽ loại bỏ '2', nhưng sau đó không còn phần tử nào cho lệnh pop thứ hai, có thể dẫn đến lỗi trừ khi có thêm mã xử lý.
d) Hàm isEmptyStack(S) với tham số truyền vào là ngăn xếp S. Hàm trả về giá trị True nếu ngăn xếp S đang rỗng không chứa phần tử nào, ngược lại hàm trả về giá trị False. Hàm isEmptyStack(S) có thể được viết như sau:
def isEmptyStack(S): return len(S) == 0
e) Nếu thay thế mỗi câu lệnh temp = pop(stack) bằng đoạn mã trong Hình 10 sẽ thêm kiểm tra rỗng trước khi thực hiện lấy phần tử từ ngăn xếp. Kết quả khi chạy chương trình sẽ phụ thuộc vào việc ngăn xếp có phần tử hay không. Nếu rỗng, nó sẽ in ra thông báo ngăn xếp rỗng. Nếu không rỗng, nó sẽ in phần tử được lấy ra.
Vận dụng trang 17 Chuyên đề Tin học 12: Em hãy viết chương trình yêu cầu người sử dụng nhập năm số nguyên dương - bất kì từ bàn phím, sau đó in ra màn hình năm số này theo thứ tự đảo ngược của thứ tự nhập vào. Trong chương trình có sử dụng kiểu dữ liệu ngăn xếp và các thao tác đã học trên ngăn xếp. Ví dụ: Nhập vào năm số: 3, 1, 9, 17, 2. Kết quả in ra: 2, 17,9, 1, 3.
Lời giải:
Chương trình yêu cầu người sử dụng nhập năm số nguyên dương - bất kì từ bàn phím, sau đó in ra màn hình năm số này theo thứ tự đảo ngược của thứ tự nhập vào. Trong chương trình có sử dụng kiểu dữ liệu ngăn xếp và các thao tác đã học trên ngăn xếp.
Muốn viết chương trình này ta sẽ sử dụng cấu trúc dữ liệu ngăn xếp (stack) để lưu trữ các số nguyên dương người dùng nhập vào. Ngăn xếp là một cấu trúc dữ liệu hoạt động theo nguyên lý LIFO (Last In, First Out), tức là phần tử được thêm vào cuối cùng sẽ là phần tử được lấy ra đầu tiên.
Sử dụng ngôn ngữ lập trình Python để thực hiện như sau:
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
if not self.is_empty():
return self.items.pop()
else:
return None
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)
def main():
stack = Stack()
print("Nhập vào năm số nguyên dương:")
# Yêu cầu người dùng nhập vào 5 số nguyên dương
for i in range(5):
while True:
try:
num = int(input(f"Nhập số thứ {i+1}: "))
if num > 0:
stack.push(num)
break
else:
print("Vui lòng nhập một số nguyên dương.")
except ValueError:
print("Đó không phải là một số nguyên. Vui lòng thử lại.")
# Lấy các số ra khỏi ngăn xếp và in theo thứ tự đảo ngược
print("Các số theo thứ tự đảo ngược:")
while not stack.is_empty():
print(stack.pop(), end=" ")
if __name__ == "__main__":
main()
Câu hỏi tự kiểm tra trang 17 Chuyên đề Tin học 12: Trong các câu sau đây, những câu nào đúng khi nói về ngăn xếp?
a) Cơ chế hoạt động của ngăn xếp là vào trước ra trước.
b) Khác với kiểu dữ liệu hàng đợi, các phần tử trong ngăn xếp được truy cập một cách trực tiếp.
c) Khi thêm ngăn xếp. một phần tử vào ngăn xếp, phần tử này sẽ được đặt ở đây của
d) Có thể thêm một phần tử mới vào vị trí bất kì trong ngăn xếp
e) Cơ chế hoạt động của ngăn xếp là vào sau ra trước.
g) Có thể xoá một phần tử bất kì khỏi ngăn xếp bằng một thao tác lấy ra.
Lời giải:
a) Sai. Ngăn xếp hoạt động theo nguyên lý LIFO (Last In, First Out), tức là phần tử được thêm vào cuối cùng sẽ được lấy ra đầu tiên.
b) Sai. Trong ngăn xếp, các phần tử không được truy cập trực tiếp. Chỉ có phần tử trên cùng (top) mới được truy cập và lấy ra.
c) Đúng. Khi thêm một phần tử vào ngăn xếp, phần tử này sẽ được đặt ở đỉnh (top) của ngăn xếp.
d) Sai. Không thể thêm một phần tử mới vào vị trí bất kỳ trong ngăn xếp. Phần tử mới chỉ có thể được thêm vào đỉnh của ngăn xếp.
e) Đúng. Cơ chế hoạt động của ngăn xếp là vào sau ra trước (LIFO - Last In, First Out).
g) Sai. Không thể xóa một phần tử bất kỳ khỏi ngăn xếp bằng một thao tác lấy ra. Chỉ có thể lấy ra và xóa phần tử ở đỉnh ngăn xếp.
Vậy đáp án đúng là: c, e.
Xem thêm các chương trình khác:
- Soạn văn 12 Cánh diều (hay nhất)
- Văn mẫu 12 - Cánh diều
- Tóm tắt tác phẩm Ngữ văn 12 – Cánh diều
- Tác giả tác phẩm Ngữ văn 12 - Cánh diều
- Bố cục tác phẩm Ngữ văn 12 – Cánh diều
- Nội dung chính tác phẩm Ngữ văn 12 – Cánh diều
- Giải sgk Toán 12 – Cánh diều
- Giải Chuyên đề học tập Toán 12 – Cánh diều
- Lý thuyết Toán 12 – Cánh diều
- Giải sbt Toán 12 – Cánh diều
- Giải sgk Tiếng Anh 12 - ilearn Smart World
- Trọn bộ Từ vựng Tiếng Anh lớp 12 ilearn Smart World đầy đủ nhất
- Trọn bộ Ngữ pháp Tiếng Anh lớp 12 ilearn Smart World đầy đủ nhất
- Giải sbt Tiếng Anh 12 – iLearn Smart World
- Giải sgk Vật lí 12 – Cánh diều
- Giải Chuyên đề học tập Vật lí 12 – Cánh diều
- Lý thuyết Vật lí 12 – Cánh diều
- Giải sbt Vật lí 12 – Cánh diều
- Giải sgk Hóa học 12 – Cánh diều
- Giải Chuyên đề học tập Hóa 12 – Cánh diều
- Lý thuyết Hóa 12 – Cánh diều
- Giải sbt Hóa 12 – Cánh diều
- Giải sgk Sinh học 12 – Cánh diều
- Giải Chuyên đề học tập Sinh học 12 – Cánh diều
- Lý thuyết Sinh học 12 – Cánh diều
- Giải sbt Sinh học 12 – Cánh diều
- Giải sgk Lịch sử 12 – Cánh diều
- Giải Chuyên đề học tập Lịch sử 12 – Cánh diều
- Giải sbt Lịch sử 12 – Cánh diều
- Giải sgk Địa lí 12 – Cánh diều
- Giải Chuyên đề học tập Địa lí 12 – Cánh diều
- Giải sbt Địa lí 12 – Cánh diều
- Giải sgk Công nghệ 12 – Cánh diều
- Giải sgk Kinh tế pháp luật 12 – Cánh diều
- Giải Chuyên đề học tập Kinh tế pháp luật 12 – Cánh diều
- Giải sbt Kinh tế pháp luật 12 – Cánh diều
- Giải sgk Giáo dục quốc phòng 12 – Cánh diều
- Giải sgk Hoạt động trải nghiệm 12 – Cánh diều