【C++初阶】容器适配器模拟实现栈和队列(附源码)
发布人:shili8
发布时间:2025-02-12 05:07
阅读次数:0
**容器适配器模拟实现栈和队列**
在 C++ 中,标准库提供了许多容器类,如 `vector`、`list` 等,这些容器类都有自己的特点和使用场景。然而,有时我们需要实现一些特殊的数据结构,比如栈和队列。在这种情况下,我们可以使用容器适配器来模拟实现这些数据结构。
**什么是容器适配器?**
容器适配器是一种设计模式,它允许我们将一个标准库提供的容器类作为另一个容器类的底层实现。通过使用容器适配器,我们可以轻松地实现一些特殊的数据结构,而不需要重新造轮子。
**栈和队列**
栈和队列都是线性表的一种特殊形式,它们都有自己的特点:
* 栈:后进先出(LIFO)的顺序,新元素总是被添加到栈顶。
* 队列:先进先出(FIFO)的顺序,新元素总是被添加到队尾。
**容器适配器模拟实现栈和队列**
下面,我们将使用 C++ 的标准库提供的 `vector` 类作为底层实现来模拟实现栈和队列:
### 栈
cpp#include <iostream> #include <vector> class Stack { private: std::vector<int> vec; public: // 添加元素到栈顶 void push(int value) { vec.push_back(value); } // 移除栈顶元素 int pop() { if (!isEmpty()) { int top = vec.back(); vec.pop_back(); return top; } else { throw std::runtime_error("Stack is empty"); } } // 检查栈是否为空 bool isEmpty() const { return vec.empty(); } // 获取栈顶元素(不移除) int peek() const { if (!isEmpty()) { return vec.back(); } else { throw std::runtime_error("Stack is empty"); } } // 获取栈的大小 size_t size() const { return vec.size(); } };
### 队列
cpp#include <iostream> #include <vector> class Queue { private: std::vector<int> vec; public: // 添加元素到队尾 void enqueue(int value) { vec.push_back(value); } // 移除队首元素 int dequeue() { if (!isEmpty()) { int front = vec.front(); vec.erase(vec.begin()); return front; } else { throw std::runtime_error("Queue is empty"); } } // 检查队列是否为空 bool isEmpty() const { return vec.empty(); } // 获取队首元素(不移除) int peekFront() const { if (!isEmpty()) { return vec.front(); } else { throw std::runtime_error("Queue is empty"); } } // 获取队尾元素(不移除) int peekBack() const { if (!isEmpty()) { return vec.back(); } else { throw std::runtime_error("Queue is empty"); } } // 获取队列的大小 size_t size() const { return vec.size(); } };
### 使用示例
cppint main() { Stack stack; stack.push(1); stack.push(2); std::cout << "栈顶元素:" << stack.peek() << std::endl; // 输出:2 std::cout << "栈大小:" << stack.size() << std::endl; // 输出:2 Queue queue; queue.enqueue(1); queue.enqueue(2); std::cout << "队首元素:" << queue.peekFront() << std::endl; // 输出:1 std::cout << "队尾元素:" << queue.peekBack() << std::endl; // 输出:2 std::cout << "队列大小:" << queue.size() << std::endl; // 输出:2 return0; }
通过使用容器适配器,我们可以轻松地实现栈和队列的数据结构,而不需要重新造轮子。这种设计模式有助于我们更好地利用标准库提供的功能,提高代码的可读性和维护性。