C++中队列、优先队列、双端队列用法

【队列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)–课堂跳了的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值