一、队列(queue)
众所周知,队列是一个神奇的数据结构(具体神奇在哪里,请自行体会),但手写的队列,你需要维护一个head和tail,还要战战兢兢地时刻注意这个head有没有被tail追到,但是——————————————
———————————————————————— 在有了STL库后,就省事多了。
声明:
需用头文件#include < queue >,然后
queue < int > q ;
基本操作(如代码所示)
#include <cstdlib>
#include <iostream>
#include <queue>
using namespace std;
int main()
{
int e,n,m;
queue<int> q1;
for(int i=0;i<10;i++)
q1.push(i); //入队
if(!q1.empty()) //是否为空
cout<<"dui lie bu kongn";
n=q1.size();//队列长度
cout<<n<<endl;
m=q1.back(); //队尾元素
cout<<m<<endl;
for(int j=0;j<n;j++)
{
e=q1.front();//队首元素
cout<<e<<" ";
q1.pop();//弹出队首
}
cout<<endl;
if(q1.empty())
cout<<"dui lie bu kongn";
system("PAUSE");
return 0;
}
需要注意的是,STL中的queue维护的是一个循环队列。
二、dequeue
这个更加神奇,不仅能在首尾操作,还可以操作中间元素。
别的不说,上代码:
#include<iostream>
#include<deque>
using namespace std;
//用下标遍历队列
void showdeque1(deque<int>& d) {
for (int i = 0; i < d.size(); i++) cout << d[i] << " ";
cout << endl;
}
//用迭代器迭代队列
void showdeque2(deque<int>& d) {
for (deque<int>::iterator it = d.begin(); it != d.end(); it++) cout << *it << " ";
cout << endl;
}
int main()
{
deque<int> d; //初始化一个双端队列
//从尾部插入元素[1,2,3,4,5],会不断扩张队列
for (int i = 1; i <= 5; i++) d.push_back(i);
//遍历双端队列
cout << "初始队列:";
showdeque1(d);
//从头部插入元素,会将另一头的元素出队
d.push_front(6);
d.push_front(7);
//用迭代器迭代队列
cout << "在头部插入6,7后的队列:";
showdeque2(d);
//在双端队列的头部删除元素
d.pop_front();
cout << "删除一个头部元素后:";
showdeque1(d);
//在双端队列的尾部删除元素
d.pop_back();
cout << "删除一个尾部元素后:";
showdeque1(d);
//从中间插入元素
d.insert(d.begin() + 1, 100);
cout << "在开头的第二个位置插入元素100:";
showdeque1(d);
//删除中间元素
d.erase(d.end() - 2);
cout << "删除倒数第二个元素:";
showdeque1(d);
cout << "size = " << d.size() << endl;
//重新指定大小,容量增加默认值为0
d.resize(6);
cout << "扩容到size = 6 :";
showdeque1(d);
cout << "减少容量到size = 2:";
d.resize(2); showdeque1(d);
d.clear();
cout << "清除容器后empty?" << d.empty() << endl;
return 0;
}
前面的两个函数都是用来遍历队列的,扩容等操作的使用就自行探究了。
三、优先队列
优先队列是一种特殊的队列,用堆来维护的队列。
那么优先队列是什么呢?
说白了,就是一种功能强大的队列。
它的功能强大在哪里呢?
四个字:自动排序。
一个优先队列声明的基本格式是:
priority_queue<结构类型> 队列名;
基本操作与queue是一致的,不过q.top()值是队列中最大或最小的一个(取决于维护的堆)
STL中默认的是大根堆
声明方式:
priority_queue <int,vector,less > p;~~~~~~~~~~~~~~~~~~ 大根堆
priority_queue <int,vector,greater > q;~~~~~~~~~~~~~~~~小根堆
这玩意更强大的一点就在于,它可以排序结构体
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int x,y;
bool operator < (const node & a) const //重载运算符
{
return x<a.x;
} //x小的在堆中就小
}k;
priority_queue <node> q;
int main()
{
k.x=10,k.y=100; q.push(k);
k.x=12,k.y=60; q.push(k);
k.x=14,k.y=40; q.push(k);
k.x=6,k.y=80; q.push(k);
k.x=8,k.y=20; q.push(k);
while(!q.empty())
{
node m=q.top(); q.pop();
printf("(%d,%d) ",m.x,m.y);
}
}
其余操作:
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p; //大根堆
priority_queue <int,vector<int>,greater<int> > q; //小根堆
int a[5]={10,12,14,6,8};
int main()
{
for(int i=0;i<5;i++)
p.push(a[i]),q.push(a[i]);
printf("less<int>:");
while(!p.empty())
printf("%d ",p.top()),p.pop();
printf("\ngreater<int>:");
while(!q.empty())
printf("%d ",q.top()),q.pop();
return 0;
}