📅  最后修改于: 2023-12-03 15:37:18.525000             🧑  作者: Mango
在 C++ 中,我们可以使用类模板来实现堆栈。堆栈是一种基于后进先出(LIFO)原则的数据结构,常见的例子包括撤销操作、函数调用和浏览器历史记录等。
我们可以使用一个数组和一个数组指针来实现堆栈。以下是实现堆栈的基本步骤:
定义一个类模板 Stack
,其中包括以下成员变量和成员函数:
T* stack_;
,指向数组的指针。size_t size_;
,堆栈的大小。size_t top_;
,数组中的堆栈顶部索引。Stack(size_t size = 10)
,构造函数,其参数是堆栈大小,其默认值为 10。~Stack()
,析构函数,释放通过 new
运算符分配的内存。void push(const T& data)
,推入元素到堆栈顶部。T& pop()
,弹出堆栈顶部的元素。T& top()
,获取堆栈顶部的元素。bool empty()
,检查堆栈是否为空。bool full()
,检查堆栈是否已满。在 Stack
类模板的实现中,我们应该通过 new
运算符分配堆内存来创建一个数组。
在构造函数中,我们应该将 top_
初始化为 0。
在推入元素到堆栈顶部时,我们应该通过 top_
将元素插入到数组中,并将 top_
值加一。
在弹出堆栈顶部的元素时,我们应该返回 top_-1
下标处的元素,并将 top_
值减一。
在获取堆栈顶部的元素时,我们应该返回 top_-1
下标处的元素。
在检查堆栈是否为空或已满时,我们应该检查 top_
是否等于 size_
或 top_
是否等于 0。
以下是实现类模板 Stack
的代码片段:
template <typename T>
class Stack {
public:
Stack(size_t size = 10) : stack_{ new T[size] }, size_{ size }, top_{ 0 } {}
~Stack() { delete[] stack_; }
void push(const T& data) { stack_[top_++] = data; }
T& pop() { return stack_[--top_]; }
T& top() { return stack_[top_-1]; }
bool empty() const { return top_ == 0; }
bool full() const { return top_ == size_; }
private:
T* stack_;
size_t size_;
size_t top_;
};
通过上述实现,我们可以使用 Stack
类模板来创建不同类型并不同大小的堆栈。以下是使用 Stack
类模板的代码片段:
Stack<int> int_stack(5); // 创建一个可以容纳 5 个 int 类型元素的堆栈
int_stack.push(1); // 推入元素到堆栈顶部
int_stack.push(2);
std::cout << int_stack.top() << std::endl; // 输出堆栈顶部的元素
int_stack.pop(); // 弹出堆栈顶部的元素
Stack<std::string> string_stack; // 创建一个默认大小可以容纳 std::string 类型元素的堆栈
string_stack.push("Hello"); // 推入元素到堆栈顶部
string_stack.push("World");
std::cout << string_stack.top() << std::endl; // 输出堆栈顶部的元素
string_stack.pop(); // 弹出堆栈顶部的元素
在 C++ 中,我们可以使用类模板来实现堆栈。通过使用堆栈,我们可以方便地实现许多常见的功能,例如撤销操作、函数调用和浏览器历史记录等。