Đỉnh ở cuối danh sách
Dùng list của Python để lưu ngăn xếp theo thứ tự đáy đến đỉnh. `append(x)` thêm ở cuối; `pop()` lấy phần tử cuối. Chỉ số đỉnh khi có phần tử là `len(S)-1`, nên không cần giữ thêm một biến chỉ số riêng.
Các hàm dưới đây chủ động báo ValueError khi rỗng. Nếu gọi trực tiếp `[].pop()` của Python, lỗi mặc định là IndexError; đây là hai cách báo lỗi khác nhau.
```python
def Stack():
return []
def isEmptyStack(S):
return len(S) == 0
def push(S, x):
S.append(x)
def pop(S):
if isEmptyStack(S):
raise ValueError("Ngăn xếp rỗng")
return S.pop()
def top(S):
if isEmptyStack(S):
raise ValueError("Ngăn xếp rỗng")
return S[-1]
```
Theo dõi sau từng thao tác
Chạy tiếp sau các định nghĩa:
```python
S = Stack()
for x in [3, 7, 2]:
push(S, x)
a = top(S)
b = pop(S)
push(S, 9)
```
|Thời điểm|S, từ đáy đến đỉnh|Giá trị vừa nhận|
|---|---|---|
|Sau vòng for|[3, 7, 2]|—|
|Sau top|[3, 7, 2]|a = 2|
|Sau pop|[3, 7]|b = 2|
|Sau push 9|[3, 7, 9]|—|
Muốn đọc dãy theo thứ tự ngược, thêm từng phần tử vào ngăn xếp rồi lấy ra tới khi rỗng. Với 3, 7, 2, kết quả là 2, 7, 3. Không lặp thêm một lần pop sau khi đã rỗng.
Bài luyện
Trong chương trình mẫu, sau top, pop rồi push 9, giá trị a, b và đỉnh mới là gì?
Đúng. top không xóa nên pop vẫn nhận 2.
top không xóa 2.
Đỉnh nằm ở cuối, không phải đáy 3.
push 9 tạo đỉnh mới là 9.
Lời giải
top trả về 2 và giữ S nguyên. pop sau đó lấy chính 2, còn [3, 7]. push 9 thêm cuối, tạo [3, 7, 9]. Vì vậy a=2, b=2 và đỉnh mới là 9.
Bài luyện
Với các hàm vừa định nghĩa, pop(Stack()) xảy ra điều gì?
Hàm đã quy định báo lỗi khi rỗng.
Không có phần tử 0 trong ngăn xếp rỗng.
Đúng. Nhánh kiểm tra rỗng được thực hiện trước.
Hàm pop không tạo phần tử.
Lời giải
Stack() tạo []. isEmptyStack trả về True nên pop thực hiện raise ValueError. Chương trình không tới dòng return S.pop(); không trả về một giá trị dữ liệu giả.
Bài luyện
Sau push(S,4), push(S,8), pop(S), push(S,6), với S ban đầu rỗng, S là gì?
pop lấy 8 ở đỉnh, không lấy 4.
8 đã bị lấy ra.
push không thêm ở đầu danh sách.
Đúng. Lấy 8 rồi thêm 6 ở cuối.
Lời giải
Hai lần push tạo [4, 8]. pop loại bỏ 8 nên còn [4]. Thêm 6 tạo [4, 6], với 6 ở đỉnh.
Đang học