上一次我们学习了关于栈的简单的操作,这一节我们来学习一下队列的操作和优先队列。
其实我们学习队列可以类比着栈来学,因为他们是差不多的,主要的区别就是栈是先进后出,而队列是先进先出,其他的操作也基本上和栈差不多。就是有一些关键字不一样。
队列的定义: 队列的定义和栈的定义是一模一样的,queue<int> que,这样我们就定义好了一个名字为que,里面的元素为int 类型的队列。
元素入队: que.push(x) 。这样就是把元素 x 放入队列中 。
查询栈顶元素:a=sta.tfront() 。这样就是把队首元素的值赋给了a 。
删除栈顶元素 sta.pop()。 这样就是把栈顶元素给删除了。
判断栈是否为空 sta.empty() .栈不空返回值为 0,栈空返回值为 1;
从中我们可以看出其实队列的操作和栈的操作基本上是一模一样的,只有一个非常明显的差异,那就是获取栈的栈顶元素的时候我们用的是 sta.top(),而获得队列的队首元素的时候我们用的是 que.front().其他的就基本上完全一样了。
我们知道队列里面的顺序是根据进队列的先后顺序进行排序的,那么我们如果另有其他的排序要求,并不想用队列本来的排序方式,那么我们还能不能用队列呢?答案是可以的,但是我们不能用简单的队列了,我们要用一个比较特别的队列,就是能够按照你的要求去进行排序的,这个东西是什么呢?那就是优先队列,这个优先队列并不是按照先入先出的规则去进行排序的,而是需要你自己去定义优先级的大小。
其实优先队列和队列事差不多的,但是又有一点的差异,现在我们就来简单的介绍一下优先队列。
优先队列的简单的操作中,有一个和队列不同的地方就是优先队列的定义,正常的队列的定义是 queue<int> que。而优先队列的定义是 priority_queue <node > que ; 这两个定义也就是有一点不一样,那就是 关键字的问题,一个是queue 另一个多加了一个 priority_其他的就一模一样了。
接下来我们来说一下优先队列最关键的地方,那就是优先队列优先级的问题,我们知道既然默认的优先级是越大优先级越高,那么我们如何来 更改这个优先级呢?
我们就用结构体来定义它的优先级,其实是和cmp函数差不多的。下面我用代码来简单的讲解一下:
//下面的排序规则是先根据u从小到大排序,如果u相等那么就根据 w 从小到大排序
struct node //首先我们借用结构体
{
char ch[105];
int z;
int w;
int u; //定义了一个元素所包含的4个元素。
friend bool operator < (node p1,node p2) //固定格式 先记住吧。
{
if(p1.u != p2.u){
return p1.u > p2.u; // "<"为从大到小排列,">"为从小到大排列
}
else{
return p1.w > p2.w;
}
}
}A;
/*
优先队列的定义 priority_queue<node> que
*/
这个里面有一个不好理解的就是 "<"为从大到小排列,">"为从小到大排列 这个可能和我们想的不太一样,大家一定要牢牢的记住。