内容摘要:
本文介绍了stack和queue的构造函数和一些成员函数,并模拟实现了stack和queue,分析了为什么选择deque作为适配器默认封装的对象
stack的介绍
栈是只能够在一端进行插入和删除的,这就是我们一直常说的“后进先出”,也就是后插入的先进行删除
stack和我们前面学习的string、vector、list是有本质区别的,stack是属于容器适配器,并不是容器,容器是可以直接进行数据的存储功能的,而容器适配器不是直接进行数据存储的容器,而是通过现有的容器进行包装。
通过指定第二个模板参数,可以用除双端队列(deque)之外的一些基础容器来指定模板参数,因为容器适配器是使用现有容器进行包装实现的,基于栈(stack)本身的结构,所以说要想称为第二个模板参数,容器本身需要支持empty()、size()、back()、push_back()、pop_back()这五种成员函数。
关于双端队列可以看上篇文章C++ deque的深入理解C++ deque的深入理解
选择deque作为stack适配器包装对象的缺省参数的原因
stack需要本身支持,push_back、pop_back和扩容操作,这些操作deque、list、vector都可以满足,当随着stack进行插入数据,deque的扩容效率比vector高,与list相比尾插尾删的效率高,并且CPU缓存速率高,详细解释看上一篇文章。
构造函数
默认构造出一个空栈
一些其他的成员函数(栈的基本操作)
- empty: 判断栈是否为空,如果栈为空则返回1,否则返回0
- size: 返回栈中的元素个数
- top: 获取栈顶元素
- push: 将元素进行入栈操作
- pop: 将元素进行出栈操作
stack的模拟实现
queue 的介绍
queue 是一种数据固定在一端进行插入一端进行删除的数据结构,在进行插入的一端称为队尾,进行出队列的一端称为对头,数据符合“先进先出”,所谓的先进先出就是先进行插入的数据也会先进行出队列
queue第二个模板参数的适配器也选择了deque作为默认封装的容器,原因是queue需要的操作是push_back和pop_front,deque的尾插和头删的效率都是非常高的,而且与list进行相比deque在内存中的空间存储连续性好,CPU缓存效率高。
构造函数
默认构造出一个空栈
一些其他成员函数(队列的基本操作)
- empty(): 判断栈是否为空
- size():返回队列中有效元素的个数
- push_back():将元素进行入队操作
- pop_front():将元素进行出队操作
- back():取栈尾元素
- front():取栈头元素
这些成员函数就决定了queue的适配器封装不了vector,因为vector不支持头删,通过erase可以进行头删,但是效率太差了。