📜  C ++ |模板|问题5(1)

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

C++ | 模板 | 问题5

在C++中,模板是一种用于创建通用代码的非常强大的工具。通过使用模板,程序员可以编写与类型无关的代码,以实现代码的重用和通用性。在本篇文章中,我们将介绍C++模板中的问题5。

问题描述

问题5是关于在C++模板中使用类模板的问题。你需要实现一个包含有限数量元素的固定大小的栈。这个栈必须满足以下要求:

  1. 具有固定的最大容量(例如10个元素)。
  2. 支持压栈(push)和弹栈(pop)操作。
  3. 如果栈已满,压栈操作应该返回错误或抛出异常。
  4. 如果栈为空,弹栈操作应该返回错误或抛出异常。

你需要通过实现一个类模板来解决这个问题。你可以使用标准库的 std::array 或者自己实现动态数组来保存栈的元素。

解决方案

以下是一个示例解决方案的代码片段,用于实现问题5的栈:

template <typename T, int Capacity>
class FixedSizeStack {
private:
    std::array<T, Capacity> stack;
    int top;

public:
    FixedSizeStack() : top(-1) {}

    void push(const T& element) {
        if (top == Capacity - 1) {
            throw std::runtime_error("Stack is full");
        }
        stack[++top] = element;
    }

    T pop() {
        if (top == -1) {
            throw std::runtime_error("Stack is empty");
        }
        return stack[top--];
    }
};

在上面的代码中,我们使用了一个类模板 FixedSizeStack 来实现问题5的栈。模板有两个参数,T 是栈元素的类型,Capacity 是栈的最大容量。

栈的内部使用了 std::array 来保存元素,top 表示栈顶的索引。在构造函数中,我们将 top 初始化为 -1,表示栈为空。

push 函数用于压栈操作。它首先检查栈是否已满,如果满了则抛出异常。否则,它将 top 的值加一,并将元素存储在 stack 中的正确位置。

pop 函数用于弹栈操作。它首先检查栈是否为空,如果是则抛出异常。否则,它将返回栈顶的元素,并将 top 的值减一。

使用示例

以下是使用示例的代码片段:

int main() {
    try {
        FixedSizeStack<int, 10> stack;

        stack.push(10);
        stack.push(20);
        stack.push(30);

        std::cout << stack.pop() << std::endl;  // 输出:30
        std::cout << stack.pop() << std::endl;  // 输出:20
        std::cout << stack.pop() << std::endl;  // 输出:10

        std::cout << stack.pop() << std::endl;  // 抛出异常:Stack is empty
    } catch (const std::exception& e) {
        std::cout << "Exception: " << e.what() << std::endl;
    }

    return 0;
}

在上面的使用示例中,我们创建了一个 FixedSizeStack<int, 10> 类型的栈,然后压入了三个整数元素。我们依次弹出栈顶的元素,并进行打印。最后,我们再次尝试弹出元素,此时会抛出一个异常,因为栈已经为空。

总结

通过使用类模板,我们可以轻松地实现通用的数据结构和算法。在本文中,我们介绍了C++模板中的问题5,展示了一个固定大小栈的实现。希望这篇文章能帮助你更好地理解C++模板,并在你的日常编程工作中发挥作用。 Happy coding!