您的位置:首页 > 产品设计 > UI/UE

STL的stack和queue读书笔记

2017-07-18 22:39 127 查看
其实stack(栈)在学习数据结构的时候就已经接触过了,栈是功能被阉割的线性表,只有一个入口,是一种先入后出的数据结构化,因为其简单操作,其实用到的地方还是挺广泛的,但本文不展开讲,因为主题还是在STL上,自然也是主要说STL的栈。

STL中的stack不是一种容器,而是容器适配器。即stack实在前面说到的容器的基础上封装而来的。从stack先进后出的特性来看,只要是线性的数据结构其实都可以作为栈的底层容器。

STL中栈的默认是以deque来作为底层数据结构的,且封装的很简单,只对stack暴露出操作尾部的接口,其实也可以用list,vector来作为底层数据结构。stack的源码中使用了底层容器的empty(),size(),back(),push_back(),pop_back(),还有各种常见的运算符重载等方法。如果我们自己实现的数据结构中实现了相应的方法,也可以直接作为stack的底层容器。

声明如下:



因为栈只能从栈顶访问数据,所以栈并没有迭代器,而是以成员方法top()来读取数据,pop(),push()来弹出和插入数据。

下面是各成员方法。要注意的是只有top()方法才会返回数据。pop()方法是直接弹出数据不返回数据的。



下面附上一个简单的用例,更多用法会在后面的文章中结合具体的问题来呈现

stack<int> t_stack;

for(int i=0;i<10;++i)
{
t_stack.push(i);    //0 ~9
}

cout<<"栈的大小:"<<t_stack.size()<<endl; //栈的大小:10

if(!t_stack.empty())
{

for(int i=0;i<10;++i)
{

cout<<t_stack.top()<<" ";//输出数据  9~0
t_stack.pop();//弹出数据
}

}

cout<<endl<<"栈的大小:"<<t_stack.size()<<endl; //栈的大小:0


下面来讲讲queue,queue和stack其实是一样的都是由基本容器封装过来的。而且都是默认的使用deque来作为底层数据结构,也可选的使用list,但不建议使用vector来作为底层数据结构,因为vector向前扩展的功能太弱。

queue是单向双口的进出原则符合先进先出,STL中提供了一个back()方法可以让我们访问队尾元素,但是无法从队尾弹出元素。

成员方法如下:



测试程序如下:

queue<int> t_queue;

for(int i=0;i<10;i++)
{
t_queue.push(i);//输入 0~9
}

cout<<"队列的大小:"<<t_queue.size()<<endl;//队列的大小:10

if(!t_queue.empty())
{
for(int i=0;i<10;i++)
{
cout<<t_queue.front()<<" ";//输出数据0~9
t_queue.pop();//弹出队头数据
}

}

cout<<endl<<"队列的大小:"<<t_queue.size()<<endl;//队列的大小:0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息