Ngăn xếp tổng quát
Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 60 trên 61.
Thử thách
DễNgăn xếp là một cấu trúc dữ liệu cơ bản tuân theo nguyên tắc vào sau, ra trước (Last-In-First-Out, LIFO): phần tử được thêm vào sau cùng sẽ được lấy ra đầu tiên. Hãy hình dung một chồng đĩa: bạn thêm đĩa lên trên cùng và lấy đĩa từ trên cùng.
Hãy xây dựng một ngăn xếp tổng quát: một cấu trúc dữ liệu linh hoạt có thể lưu trữ mọi kiểu dữ liệu bằng các con trỏ void*. Ngăn xếp của bạn sẽ tuân theo nguyên tắc vào sau, ra trước và có đầy đủ các thao tác thiết yếu.
Bạn sẽ sắp xếp code trong ba tệp:
stack.h: Định nghĩa structStackvới ba thành viên: một mảngvoid**để lưu các phần tử, mộtintlàm chỉ số đỉnh (vị trí trống tiếp theo) và mộtintlàm sức chứa. Khai báo nguyên mẫu các hàm để tạo ngăn xếp (nhận sức chứa), thêm một phần tử, lấy một phần tử ra, xem phần tử trên cùng, kiểm tra ngăn xếp có rỗng không và giải phóng ngăn xếp.stack.c: Cài đặt ngăn xếp tổng quát của bạn:create_stack: cấp phát một Stack trên heap, cấp phát mảng phần tử với sức chứa đã cho, khởi tạo top bằng 0 và trả về con trỏpush: thêm một phần tử lên đỉnh nếu còn chỗ (khi top nhỏ hơn capacity)pop: lấy và trả về phần tử trên cùng, hoặc trả vềNULLnếu ngăn xếp rỗngpeek: trả về phần tử trên cùng mà không lấy nó ra, hoặc trả vềNULLnếu ngăn xếp rỗngis_empty: trả về 1 nếu ngăn xếp không có phần tử nào, ngược lại trả về 0free_stack: giải phóng mảng phần tử trước, sau đó giải phóng chính struct Stack
main.c: Đọc số thao tác cần thực hiện. Sau đó, với mỗi thao tác, đọc một lệnh:pushtheo sau là một giá trị số nguyên,pophoặcpeek. Tạo ngăn xếp có sức chứa 10. Vớipush, cấp phát một số nguyên trên heap rồi thêm con trỏ của nó vào ngăn xếp. Vớipop, lấy phần tử ra, in giá trị của nó rồi giải phóng số nguyên. Vớipeek, in giá trị mà không lấy phần tử ra. Nếu gọipophoặcpeekkhi ngăn xếp rỗng, hãy inempty. Sau khi thực hiện tất cả thao tác, giải phóng mọi phần tử còn lại và ngăn xếp.
Chương trình của bạn sẽ nhận:
- Số thao tác
- Mỗi thao tác trên một dòng riêng (
push X,pophoặcpeek)
Đầu ra ví dụ khi đầu vào là 5, sau đó là push 10, push 20, peek, pop, pop:
20
20
10Đầu ra ví dụ khi đầu vào là 3, sau đó là pop, push 42, peek:
empty
42Đầu ra ví dụ khi đầu vào là 4, sau đó là push 5, push 15, pop, pop:
15
5Hãy nhớ rằng ngăn xếp lưu các con trỏ void*: bên gọi chịu trách nhiệm cấp phát và giải phóng dữ liệu thực tế. Khi lấy phần tử ra, hãy ép kiểu void* được trả về thành int* để truy cập giá trị. Dùng strcmp từ <string.h> để so sánh các chuỗi lệnh.
Tự làm thử
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"
int main() {
int n;
scanf("%d", &n);
// TODO: Tạo ngăn xếp (stack) có sức chứa 10
// TODO: Xử lý từng thao tác
for (int i = 0; i < n; i++) {
char command[10];
scanf("%s", command);
if (strcmp(command, "push") == 0) {
int value;
scanf("%d", &value);
// TODO: Cấp phát một số nguyên trên vùng nhớ heap rồi push con trỏ của nó vào ngăn xếp
}
else if (strcmp(command, "pop") == 0) {
// TODO: Lấy phần tử ra khỏi ngăn xếp
// - Nếu khác NULL, in ra giá trị và giải phóng bộ nhớ của số nguyên
// - Nếu là NULL (ngăn xếp rỗng), in ra "empty"
}
else if (strcmp(command, "peek") == 0) {
// TODO: Xem phần tử trên cùng của ngăn xếp
// - Nếu khác NULL, in ra giá trị (không lấy phần tử ra hoặc giải phóng bộ nhớ)
// - Nếu là NULL (ngăn xếp rỗng), in ra "empty"
}
}
// TODO: Giải phóng bộ nhớ của các phần tử còn lại trong ngăn xếp
// TODO: Giải phóng bộ nhớ của chính ngăn xếp
return 0;
}
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online