介绍
- stack在头文件stack头文件中使用,也是个适配器,它给底层类(默认情况下为vector)提供典型的栈接口。
- stack不仅不允许随机访问栈元素,甚至不允许遍历栈。
- stack使用限制在定义栈的基本操作,即可以将压入推到栈顶,从栈顶弹出元素,查看栈顶的值,检查元素数目和测试栈是否为空。栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
栈中进入数据称为 — 入栈 push
栈中弹出数据称为 — 出栈 pop
top永远指向栈顶元素 - stack是一种先进后出的数据结构,它只有一个出口,没有迭代器。
注:与queue相似,如果要使用栈中的值,必须首先使用top()l来检索这个值,然后使用pop()将它从栈中删除。
stack常用接口
功能描述:栈容器常用的对外接口
构造函数:
- stack stk; //stack采用模板类实现, stack对象的默认构造形式
- stack stk; //stack采用模板类实现, stack对象的默认构造形式
赋值操作:
- stack& operator=(const stack &stk); //重载等号操作符
数据存储:
1. push(elem); //向栈顶添加元素
2. pop(); //从栈顶移除第一个元素
3. top(); //返回栈顶元素
**大小操作:**
1. empty(); //判断堆栈是否为空
2. size(); //返回栈的大小
#include<iostream>
#include<stack>
using namespace std;
//栈容器常用接口
void test01()
{
// 创建栈容器 栈容器必须符合先进后出
stack<int> s;
//向栈中添加源 叫 压栈 入栈
s.push(10);
s.push(20);
s.push(30);
if(s.empty())
{
cout<<"栈为空"<<endl;
}else
{
cout<<"栈容器非空"<<endl;
cout<<"size = "<<s.size()<<endl;
}
while(!s.empty())//非空 返回false
{
cout<<s.top()<<endl;
//出栈
s.pop();
}
}
int main()
{
test01();
return 0;
}
总结:
- 入栈 — push
2.入栈 — push - 返回栈顶 — top
- 判断栈是否为空 — empty
- 返回栈大小 — size
queue容器
介绍
- queue模板类在头文件queue中使用,是个适配器。ostream_iterator模板是个适配器,让输出流能够使用迭代器接口,同样,queue模板让底层类(默认为deque)展示典型的队列接口
- queue不仅不允许随机访问队列元素,甚至不允许遍历队列;队列容器允许从一端新增元素,从另一端移除元素;队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为;队列中进数据称为 — 入队 push;队列中出数据称为 — 出队 pop
- 它把使用限制在定义队列的基本操作上,可以将元素添加到队尾,从队首删除元素,查看队首和队尾的值,检查元素数目和测试队列释放为空。
- queue是一种先进先出的数据结构,有两个出口。
注:pop()是个删除数据的方法,而不是检索数据的方法。如果要使用队列中的值,应首先使用front()来检索这个值,然后使用pop()将从队列中删除。
queue常用接口
功能描述:栈容器常用的对外接口
构造函数:
- queue que; //queue采用模板类实现,queue对象的默认构造形式
- queue(const queue &que); //拷贝构造函数
赋值操作:
- queue& operator=(const queue &que); //重载等号操作符
数据存取:
- push(elem); //往队尾添加元素
- pop(); //从队头移除第一个元素
- back(); //返回最后一个元素
- front(); //返回第一个元素
大小操作:
- empty(); //判断堆栈是否为空
- size(); //返回栈的大小
#include<iostream>
#include<queue>
#include<string>
using namespace std;
class Person
{
public:
string m_name;
int m_age;
public:
Person(string name, int age)
{
this->m_name = name;
this->m_age = age;
}
};
void test01()
{
//创建队列
queue<Person> q;
//准备数据
Person p1("小华", 30);
Person p2("小明", 1000);
Person p3("Tom", 900);
Person p4("lucy", 800);
//向队列中添加元素 入队操作
q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4);
//队列不提供迭代器,更不支持随机访问
while (!q.empty())
{
//输出队列元素
cout << "队头元素--姓名:" << q.front().m_name
<< "年龄:" << q.front().m_age << endl;
cout << "队尾元素--姓名:" << q.back().m_name
<< "年龄:" << q.back().m_age << endl;
cout << endl;
//弹出队头元素
q.pop();
}
cout << "队列大小:" << q.size() << endl;
}
int main()
{
test01();
return 0;
}
总结:
- 入队 — push
- 出队 — pop
- 返回队头元素 — front
- 返回队尾元素 — back
- 判断队是否为空 — empty
- 返回队列大小 — size
priority_queue
- priority_queue模板类在queue头文件中声明,操作与queue相同。
- priorty_queue与queue区别在于,priority_queue中,最大的元素被移到队首。内部区别在于,默认的底层类是vector。
- 可以修改用于确定那个元素放到队首的比较方式,提供了可选的构造参数:priorty_queuepq1;//默认版本; priority_queuepq2(greater);//使用greater顺序
array(c++11)
array并非STL容器,因为其长度是固定的,因此,array没有固定定义调整容器大小的操作,如push_back()和insert(),但定义了对它来说有意义的成员函数,如operator和at()。可将很多标准STL算法用于array对象,如copy()和for_each()。