【队列queue】
头文件:#include <queue>
普通声明:queue<int> q;
结构体:
struct node{
int x,y;
};
queue<node> q;
转自: C++ 队列queue的用法
C++队列queue模板类的定义在<queue>
头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
C++队列Queue类成员函数如下:
back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数
queue 的基本操作举例如下:
queue入队,如例:q.push(x); 将x 接到队列的末端。
queue出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问queue队首元素,如例:q.front(),即最早被压入队列的元素。
访问queue队尾元素,如例:q.back(),即最后被压入队列的元素。
判断queue队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
【优先队列priority_queue】
优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。
队列和优先级队列的头文件都是#include <queue>
下面这篇转自: C++(标准库)栈和队列以及优先队列的使用
使用标准库的栈
#include <stack> //头文件
stack<int> s; //定义一个 int 型的栈
s.empty() //如果栈为空返回true,否则返回false
s.size() //返回栈中元素的个数
s.pop() //删除栈顶元素但不返回其值
s.top() //返回栈顶的元素,但不删除该元素
s.push() //在栈顶压入新元素
使用标准库的队列
#include <queue> //头文件
queue<int> q; //定义一个 int 型的队列
q.empty() //如果队列为空返回true,否则返回false
q.size() //返回队列中元素的个数
q.pop() //删除队列首元素但不返回其值
q.front() //返回队首元素的值,但不删除该元素
q.push() //在队尾压入新元素
q.back() //返回队列尾元素的值,但不删除该元素
优先队列
优先级队列支持的操作
q.empty() //如果队列为空,则返回true,否则返回false
q.size() //返回队列中元素的个数
q.pop() //删除队首元素,但不返回其值
q.top() //返回具有最高优先级的元素值,但不删除该元素
q.push(item) //在基于优先级的适当位置插入新元素
测试代码:C++(标准库)栈和队列以及优先队列的使用
声明方式:
1.普通方式:
priority_queue<int> q;
//通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector<int>,greater<int> > q;
//通过操作,按照元素从小到大的顺序出队
2.自定义优先级:
struct cmp {
operator bool ()(int x, int y)
{
return x > y; // x小的优先级高
//也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};```
priority_queue<int, vector<int>, cmp>q; //定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。
3.结构体声明方式
struct node {
int x, y;
friend bool operator < (node a, node b) {
return a.x > b.x; //结构体中,x小的优先级高
}
};
priority_queue<node>q; //定义方法
//在该结构中,y为值, x为优先级。
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
【双端队列】
双端队列用法
1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
//创建deque
deque<int> d1; //创建一个没有任何元素的deque对象
deque<int> 2(10);//创建一个具有10个元素的deque对象,每个元素值为默认
deque<double> d3(10, 5.5); //伊妹一个具有10个元素的deque对象,每个元素的初始值为5.5
deque<double> d4(d3); //通过拷贝一个deque对象的元素值, 创建一个新的deque对象
//初始化赋值:同vector一样,使用尾部插入函数push_back()
for (int i = 1; i < 6 ; i++) d1.push_back(i*10);
cout<<"printDeque(d1) : "<<endl;
printDeque(d1);
遍历元素: 1-下标方式 2-迭代器方式 反向遍历(略)
//元素插入:尾部插入用push_back(),头部插入用push_front(),其它位置插入用insert(&pos, elem)
cout<<"d1.push_front(100): "<<endl;
d1.push_front(100);
printDeque(d1);
cout<<"d1.insert(d1.begin()+3, 200): "<<endl; //支持随机存取(即[]操作符),所以begin()可以+3
d1.insert(d1.begin()+2,200);
printDeque(d1);
//元素删除 尾部删除用pop_back();头部删除用pop_front();
//任意迭代位置或迭代区间上的元素删除用erase(&pos)/erase(&first, &last);删除所有元素用clear();
cout<<"d1.pop_front(): "<<endl;
d1.pop_front();
printDeque(d1);
cout<<"d1.erase(d1.begin()+1): "<<endl;
d1.erase(d1.begin()+1); //删除第2个元素d1[1]
printDeque(d1);
cout<<"d1.erase(d1.begin(), d1.begin() + 2) = "<<endl;
d1.erase(d1.begin(), d1.begin() + 2);
printDeque(d1);
cout<<"d1.clear() :"<<endl;
d1.clear();
printDeque(d1);
//其它常用
cout<<"其它常用用法: "<<endl;
int flag = 0;
while(flag < 2){
if (0 == flag ) {
for (int i = 1; i < 6 ; i++) //恢复
d1.push_back(i*10);
}
else {
d1.clear();
cout<<"after d1.clear() , d1.front(), d1.back() is abnormal! other info.:"<<endl;
}
cout<<"d1.empty() = "<<d1.empty()<<endl;
cout<<"d1.size() = "<<d1.size()<<endl;
cout<<"d1.max_size() = "<<hex<<d1.max_size()<<endl;
if (!d1.empty()){
cout<<"d1.front() = "<<d1.front()<<endl;
cout<<"d1.back() = "<<d1.back()<<endl;
}
flag++;
}
//交换
cout<<"d1.swap(d5)= "<<endl;
d1.swap(d5);
cout<<"d1 = ";
printDeque(d1);
cout<<"d5 = ";
printDeque(d5);
//printDeque(d)
}
另一篇转自:双端队列(deque)–课堂跳了的内容