📜  在 C++ 中使用类模板实现堆栈(1)

📅  最后修改于: 2023-12-03 15:37:18.525000             🧑  作者: Mango

在 C++ 中使用类模板实现堆栈

在 C++ 中,我们可以使用类模板来实现堆栈。堆栈是一种基于后进先出(LIFO)原则的数据结构,常见的例子包括撤销操作、函数调用和浏览器历史记录等。

堆栈的实现

我们可以使用一个数组和一个数组指针来实现堆栈。以下是实现堆栈的基本步骤:

  1. 定义一个类模板 Stack,其中包括以下成员变量和成员函数:

    1. T* stack_;,指向数组的指针。
    2. size_t size_;,堆栈的大小。
    3. size_t top_;,数组中的堆栈顶部索引。
    4. Stack(size_t size = 10),构造函数,其参数是堆栈大小,其默认值为 10。
    5. ~Stack(),析构函数,释放通过 new 运算符分配的内存。
    6. void push(const T& data),推入元素到堆栈顶部。
    7. T& pop(),弹出堆栈顶部的元素。
    8. T& top(),获取堆栈顶部的元素。
    9. bool empty(),检查堆栈是否为空。
    10. bool full(),检查堆栈是否已满。
  2. Stack 类模板的实现中,我们应该通过 new 运算符分配堆内存来创建一个数组。

  3. 在构造函数中,我们应该将 top_ 初始化为 0。

  4. 在推入元素到堆栈顶部时,我们应该通过 top_ 将元素插入到数组中,并将 top_ 值加一。

  5. 在弹出堆栈顶部的元素时,我们应该返回 top_-1 下标处的元素,并将 top_ 值减一。

  6. 在获取堆栈顶部的元素时,我们应该返回 top_-1 下标处的元素。

  7. 在检查堆栈是否为空或已满时,我们应该检查 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++ 中,我们可以使用类模板来实现堆栈。通过使用堆栈,我们可以方便地实现许多常见的功能,例如撤销操作、函数调用和浏览器历史记录等。