用基础方法写出C++代码:使用类模板实现栈的设计,支持动态存储任意类型的数据,实现进栈操作,出栈操作,判断栈是否满了,判断栈是否为空。设计一个学生类,有学号和姓名两个成员数据,创建两个学生对象,然后进行两次进栈操作,再做两次出栈操作,出栈同时将学生信息显示出来。
时间: 2024-12-23 10:21:45 浏览: 5
在C++中,我们可以使用类模板和动态内存管理来实现一个通用的栈。首先,我们定义一个模板栈`Stack`类,包含基本的操作方法:
```cpp
template <typename T>
class Stack {
private:
std::vector<T> data;
size_t capacity;
public:
// 构造函数,设置默认容量
Stack(size_t initCapacity = 10)
: capacity(initCapacity) {}
// 判断栈是否已满
bool isFull() const {
return data.size() == capacity;
}
// 判断栈是否为空
bool isEmpty() const {
return data.empty();
}
// 进栈操作
void push(const T& value) {
if (!isFull()) {
data.push_back(value);
} else {
throw std::runtime_error("Stack is full");
}
}
// 出栈操作并返回顶部元素
T pop() {
if (isEmpty()) {
throw std::runtime_error("Stack is empty");
}
T top = data.back();
data.pop_back();
return top;
}
};
```
接下来,我们定义一个`Student`类:
```cpp
class Student {
public:
int id;
std::string name;
// 构造函数
Student(int id, std::string name) : id(id), name(name) {}
// 为了便于打印,提供友元函数
friend std::ostream& operator<<(std::ostream& os, const Student& student) {
return os << "Student{" << "id: " << student.id << ", name: " << student.name << "}";
}
};
```
现在我们可以使用这个栈来操作学生对象:
```cpp
int main() {
// 创建两个学生对象
Student s1(1, "Alice");
Student s2(2, "Bob");
// 创建栈,假设初始容量足够大
Stack<Student> stack;
try {
// 进栈操作
stack.push(s1);
stack.push(s2);
// 打印出栈前的状态
std::cout << "Before popping:\n";
for (const auto& student : stack.data) {
std::cout << student << "\n";
}
// 出栈操作,并打印结果
std::cout << "Popped student (id=" << stack.pop().id << "): " << stack.pop() << "\n";
// 再次出栈,此时栈应该为空了
if (!stack.isEmpty()) {
std::cerr << "Error: Stack should be empty after two pops.\n";
}
// 最后检查栈是否为空
if (stack.isEmpty()) {
std::cout << "Stack is now empty.\n";
} else {
std::cerr << "Error: Stack should be empty but is not.\n";
}
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << '\n';
}
return 0;
}
```
阅读全文