栈
- #pragma once
- #include
- using namespace std;
-
- namespace hqj
- {
- template<class T, class Con = deque
> -
- class stack
- {
- public:
- stack()
- :_c()
- {}
-
- void push(const T& x)
- {
- _c.push_back(x);
- }
-
- void pop()
- {
- _c.pop_back();
- }
-
- T& top()
- {
- return _c.back();
- }
-
- const T& top()const
- {
- return _c.back();
- }
-
- size_t size()const
- {
- return _c.size();
- }
-
- bool empty()const
- {
- return _c.empty();
- }
-
- private:
-
- Con _c;
-
- };
- }
队列
- template<class T, class Con = deque
> -
- class queue
- {
-
- public:
-
- queue()
- :_c()
- {}
- void push(const T& x)
- {
- _c.push_back(x);
- }
-
-
- void pop()
- {
- _c.pop_front();
- }
-
- T& back()
- {
- return _c.back();
- }
-
- const T& back()const
- {
- return _c.back();
- }
-
- T& front()
- {
- return _c.front();
- }
-
- const T& front()const
- {
- return _c.front();
- }
-
- size_t size()const
- {
- return _c.size();
- }
-
- bool empty()const
- {
- return _c.empty();
- }
-
- private:
-
- Con _c;
- };
- }
选择deque作为栈的底层容器
- template<class T, class Con = deque<T>>
一个容器对象_con
Con _c;
因为_c是个容器对象,自身有构造函数,构造stack时会自动调用_C的构造函数,所以我们可以不写
- stack()
- :_c()
- {}
栈的特点为栈顶入栈、栈顶出栈
我们之间使用容器对象_c的尾插函数便可以实现栈的入栈
- void push(const T& x)
- {
- _c.push_back(x);
- }
栈的特点为栈顶入栈、栈顶出栈
我们之间使用容器对象_c的尾删函数便可以实现栈的出栈
- void pop()
- {
- _c.pop_back();
- }
栈顶恰恰是底层容器的末元素,我们直接调用底层容器_c的back函数即可
提供两个版本,一个是const、另一个是非const
- T& top()
- {
- return _c.back();
- }
-
- const T& top()const
- {
- return _c.back();
- }
底层容器中有多少数据就代表栈有多少数据,直接复用底层容器_c的size
- size_t size()const
- {
- return _c.size();
- }
底层容器不为空栈也就不为空,还是直接复用底层容器_c的empty
- bool empty()const
- {
- return _c.empty();
- }
队列也是容器适配器的玩法,直接调用底层容器_C的构造函数
- queue()
- :_c()
- {}
选择deque作为队列的底层容器
- template<class T, class Con = deque<T>>
一个容器对象_con
Con _c;
队列的特点是队尾入队,队头出队
根据特点,我们调用底层容器的尾插函数即可
- void push(const T& x)
- {
- _c.push_back(x);
- }
队列的特点是队尾入队,队头出队
根据特点,我们调用底层容器的头删函数即可
- void pop()
- {
- _c.pop_front();
- }
该接口负责返回队尾元素
而队尾恰恰是底层容器的末元素,直接复用底层容器的back函数
- T& back()
- {
- return _c.back();
- }
-
- const T& back()const
- {
- return _c.back();
- }
该接口负责返回队头元素
而队头恰恰是底层容器的首元素,直接复用底层容器的front函数
- T& front()
- {
- return _c.front();
- }
-
- const T& front()const
- {
- return _c.front();
- }
底层容器有多少数据,该队列就有多少数据,依然是复用即可
- size_t size()const
- {
- return _c.size();
- }
底层容器不为空,队列便不为空,复用底层容器的判空函数
- bool empty()const
- {
- return _c.empty();
- }
介绍栈和队列的模拟实现,之前有在C语言阶段实现过栈和队列,所以本文对栈和队列的结构不做解释。玩法是容器适配器玩法,底层容器选择的是双端队列,这是一种又像数组又像链表的东西。