CPP的Queue模拟实现
Queue的概念
列可以想象成一种特殊的栈,我们在前面提到,栈遵循的原则是后进先出,列遵循的原则则是先进先出。列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列。进行插入操作的一端称为队尾。出队列:进行删除操作的一端称为队头。
底层容器可以是标准容器类模板之一, 也可以是其他的容器, 但是实现出来的Queue最少应该实现以下操作:
- empty: 是否为空
- size: 返回有效个数元素
- front: 返回队头元素的引用
- back: 返回队尾元素的引用
- push_back: 在队尾入队列
- pop_front: 在对头出队列
Queue的使用
这里用一道OJ题来快速熟悉队列的思想, 剑指 Offer 10- I. 斐波那契数列.
虽然这道题目并没有实际使用到CPP的队列, 但是用到了队列的思想, 题解如下:
class Solution { public: int fib(int n) { int left = 0; int mid = 1; int right = 1; while(n--) { left = mid % 1000000007; mid = right % 1000000007; right = (mid + left) % 1000000007; } return left; } };
接着来看CPlusPlus网站对于Queue的部分函数介绍:
函数声明 接口说明 queue 构造queue empty 判断queue是否为空 size 返回有效个数元素 front 返回队头元素的引用 back 返回队尾元素的引用 push 在队尾入队列 emplace 替换 pop 在对头出队列
Queue的实现
这里为了简单, 底层容器使用vector.
#include <iostream> #include <vector> namespace pc { template<class T> class queue { public: void push(const T& data) { data_.push_back(data); } void pop() { if(!data_.empty()) { data_.erase(data_.begin()); } } bool empty() const { return data_.empty(); } size_t size() const { return data_.size(); } T& front() { return data_.front(); } T& back() { return data_.back(); } void display() { for(auto& x : data_) { std::cout << x << " "; } std::cout << std::endl; } private: std::vector<T> data_; }; }; #include "queue.hpp" int main() { pc::queue<int> queue; queue.push(1); queue.push(2); queue.push(3); queue.push(4); queue.push(5); queue.push(6); queue.push(7); queue.display(); queue.pop(); queue.pop(); queue.pop(); queue.pop(); queue.display(); std::cout << queue.size() << std::endl; std::cout << queue.empty() << std::endl; return 0; }