下面是一个使用模板类实现的简单栈(Stack)的示例。这个栈类支持基本操作,如入栈(push)、出栈(pop)、查看栈顶元素(top)和检查栈是否为空(isEmpty)。我将在类模板中定义这些方法,并展示如何在主函数中使用该模板类。
#include <iostream>
#include <vector>
#include <stdexcept> // For std::out_of_range
template<typename T>
class Stack {
private:
std::vector<T> elements;
public:
// 将元素压入栈顶
void push(const T& elem) {
elements.push_back(elem);
}
// 弹出栈顶元素
void pop() {
if (elements.empty()) {
throw std::out_of_range("Stack<>::pop(): empty stack");
}
elements.pop_back();
}
// 返回栈顶元素
T top() const {
if (elements.empty()) {
throw std::out_of_range("Stack<>::top(): empty stack");
}
return elements.back();
}
// 检查栈是否为空
bool isEmpty() const {
return elements.empty();
}
};
int main() {
Stack<int> intStack; // 整型栈
Stack<std::string> stringStack; // 字符串栈
// 操作整型栈
intStack.push(7);
intStack.push(13);
std::cout << "Top element of intStack: " << intStack.top() << std::endl;
intStack.pop();
std::cout << "Top element of intStack after pop: " << intStack.top() << std::endl;
// 操作字符串栈
stringStack.push("Hello");
stringStack.push("World");
std::cout << "Top element of stringStack: " << stringStack.top() << std::endl;
stringStack.pop();
std::cout << "Top element of stringStack after pop: " << stringStack.top() << std::endl;
return 0;
}
代码解释:
-
模板类定义:
Stack
是一个模板类,其类型参数为T
。它使用std::vector<T>
来存储栈的元素。这使得它能够存储任何类型的数据,并动态地管理内存。 -
成员函数:
push(const T& elem)
:在栈顶添加一个新元素。pop()
:移除栈顶元素。如果栈为空,则抛出std::out_of_range
异常。top()
:返回栈顶元素的值。如果栈为空,也抛出异常。isEmpty()
:返回一个布尔值,表示栈是否为空。
-
主函数中的使用:
- 创建两个栈的实例:一个用于整数,另一个用于字符串。
- 对每个栈进行一系列操作,演示如何添加、移除和访问元素。
这个栈的实现利用了C++模板的灵活性,使得同一个栈类可以用于任何类型的数据。另外,它也展示了异常处理的使用,确保在尝试从空栈中弹出或获取元素时能够安全地报告错误。