目录
一、stack类
1.1stack的介绍和使用
1.11 stack是一种容器适配器,专门用在具有先进后出的上下文环境中,插入和删除都只能从一端操作。
1.12 stack作为容器适配器实现,它底层是其他类或容器。它只需要提供一些函数接口实现功能就好。
1.13stack的底层容器可以是任何标准的容器类也可以是其他特定的容器类。这些容器应该支持以下操作:
empty:判空
push:压一个元素入栈
top:取栈顶的元素
pop:在栈顶出数据
1.14 标准默认容器vector,list,deque都符合这些需求,默认情况下,如果没有为stack指定特定底层容器,默认情况下均用deque。
deque也是一种特殊的容器,它的功能是链表和顺序表的结合体。它存数据可以从中间插入,也可以从尾插,就是访问数据不如vector高效,随机插入删除也比不上链表。所以平常大家都不怎么用它。
2.stack的函数和接口
stack() 构造函数,构造一个空栈
empty() 判断栈是否是空的
size() 判断这个栈元素的个数
top() 取栈顶的元素
push() 压栈
pop() 在栈顶出数据
3.stack的模拟实现
说明:模板的定义这里第一个class T是类型,第二个是底层的容器。所以如果要声明一个stack的变量,按照以下形式:
命名空间::stack<int,vector<int>> s1;
这里把T实例化成了int ,class Con被实例化成了vector<int>,这两个也可以用其他的类型和容器替代。
template<class T, class Con = deque<T>>
class stack
{
public:
stack()
{
}
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_back();
}
T& top()
{
return _c.front();
}
const T& top()const
{
return _c.front();
}
size_t size()const
{
return _c.size();
}
bool empty()const
{
return _c.empty();
}
private:
Con _c;
};
二、queue类
2.1 queue的介绍和使用
2.11 队列是一种容器适配器,专门用于在FIFO上下文环境中操作,其中从一端插入元素,从另一端读取元素。不支持随机访问(也不能支持)。
2.12 队列作为容器适配器实现,容器适配器,就是将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
2.13 底层容器是标准类容器,也可以是其他特定的容器类。该底层容器至少支持以下操作。
empty:检测队列是否为空
size:检测队列的元素个数
front:取出队列第一个元素
back:取出队列最后一个元素
push:尾插一个元素
pop:在队列头部出队列
2.14 标准容器类deque和list满足了这些要求,默认情况下,如果没有为deque实例化指定容器类,则使用标准容器类deque。
2.2queue的使用,略。
在2.13已经介绍了。
2.3 queue类的模拟实现
注意要点和stack类的模拟实现差不多,没什么难度。需要注意的是接口不一样的。
栈取首元素,是用top函数,而队列取首元素用front函数。
template<class T, class Con = deque<T>>
class queue
{
public:
queue()
{
}
void push(const T& x)
{
_c.push_back(x);
}
void pop()
{
_c.pop_back();
}
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;
};