用C++编写一个程序,使用类模板实现栈的设计,支持动态存储任意类型的数据,实现进栈操作,出栈操作,判断栈是否满了,判断栈是否为空。设计一个学生类,有学号和姓名两个成员数据,创建两个学生对象,然后进行两次进栈操作,再做两次出栈操作,出栈同时将学生信息显示出来。
时间: 2024-12-23 20:21:35 浏览: 28
首先,我们来创建一个C++类模板,用于表示栈的基本结构。这个模板将会支持动态存储任意类型的数据:
```cpp
template <typename T>
class Stack {
public:
// 初始化栈容量
Stack(int capacity) : top(-1), size(0), capacity(capacity) {}
// 判断栈是否为空
bool isEmpty() const { return top == -1; }
// 判断栈是否已满
bool isFull() const { return size == capacity; }
// 进栈操作
void push(const T& value) {
if (isFull()) {
throw std::runtime_error("Stack overflow");
}
data[++top] = value;
size++;
}
// 出栈操作
T pop() {
if (isEmpty()) {
throw std::runtime_error("Stack underflow");
}
T value = data[top--];
size--;
return value;
}
private:
int top; // 栈顶元素的索引
int size; // 当前栈内元素的数量
int capacity; // 栈的最大容量
T data[capacity]; // 存储栈元素的数组
};
```
接下来,我们定义一个学生类`Student`:
```cpp
class Student {
public:
Student(int id, const std::string& name)
: student_id(id), name(name) {}
int getStudentId() const { return student_id; }
const std::string& getName() const { return name; }
private:
int student_id;
std::string name;
};
int main() {
// 创建两个学生对象
Student s1(1, "Alice");
Student s2(2, "Bob");
// 创建一个栈,用于存储学生对象
Stack<Student*> stack(2);
try {
// 进栈操作
stack.push(&s1);
stack.push(&s2);
// 输出入栈的学生信息
std::cout << "Student popped: ID = " << stack.pop().getStudentId()
<< ", Name = " << stack.pop().getName() << "\n";
// 再次尝试出栈,这时应该会抛出异常,因为栈已经空了
stack.pop(); // This will throw an exception
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
}
return 0;
}
```
在这个例子中,我们创建了一个`Stack`模板实例来存储`Student*`类型的指针,并演示了如何通过这个栈进行进栈、出栈以及检查栈状态的操作。
阅读全文