#2020寒假集训#C++STL-queue、priority_queue和stack代码笔记
程序员文章站
2022-06-02 12:12:12
...
#include<stdio.h>
#include<cstdio>//C++ scanf等的头文件
#include<iostream>//C++ cin/cout等的头文件
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>//queue和priority_queue等的头文件
#include<stack>//stack头文件
#include<bits/stdc++.h>//万能头文件
#include<algorithm>
using namespace std;
struct node
{
int x;
int y;
friend bool operator < (const node &a,const node &b)
{//friend叫做友元,加了才能重载运算符,运算符包括</>/=等等
/*
结构体本身(不访问的情况下)无法直接用>/</=等比较大小
所有需要"重载运算符"才能进行结构体的比较
此结构体的优先队列就按这个比较方法实现优先
*/
if(a.x!=b.x)//当x不同的时候
{
return a.x<b.x;//"<"是大的排在前先出列,">"是小的排在前先出列
}
else//如果x值一样
{
return a.y>b.y;//">"是小的先出列
}
}//这种有&的取地址,会比较快,没有赋值过程
}a;
queue<int> q; //队列是【先进先出】的,队尾插入,队首移除
priority_queue<node> pq;//内部构造原理是【堆】
priority_queue<int,vector<int>,greater<int> > gq;
//greater<int>用来逆序,但其实用相反数进行比大小再输出也能达到逆序的效果
int main()
{
printf("\n【队列先进先出】\n\n");
a.x=1;
pq.push(a);//按指定优先级插入1
gq.push(1);
q.push(1); //在队尾插入1
a.x=2;
pq.push(a);//按指定优先级插入2
gq.push(2);
q.push(2); //在队尾插入2
a.x=3;
pq.push(a);//按指定优先级插入3
gq.push(3);
q.push(3); //在队尾插入3
/*
pq的优先队列->3 2 1(一边插入一边排序)
q的队列是->1 2 3
*/
printf("pq优先队列的初始首元素:%d\n\n",pq.top());
printf("gq优先队列的初始首元素:%d\n\n",gq.top());
printf("q队列的初始首元素:%d 初始尾元素:%d\n\n",q.front(),q.back());
pq.pop();
gq.pop();
q.pop();
printf("pq优先队列的弹出1次首元素后的首元素:%d\n\n",pq.top());
printf("gq优先队列的弹出1次首元素后的首元素:%d\n\n",gq.top());
printf("q队列的弹出1次首元素后的首元素:%d 尾元素:%d\n\n",q.front(),q.back());
pq.pop();
gq.pop();
q.pop();
printf("pq优先队列的弹出2次首元素后的首元素:%d\n\n",pq.top());
printf("gq优先队列的弹出2次首元素后的首元素:%d\n\n",gq.top());
printf("q队列的弹出2次首元素后的首元素:%d 尾元素:%d\n\n",q.front(),q.back());
pq.pop();
gq.pop();
q.pop();
/*
对pq和q而言,pop()移除的都是首元素
只是优先队列的顺序不是插入顺序,而是排序顺序
*/
printf("pq优先队列的弹出3次首元素后的首元素:%d\n\n",pq.top());
//优先队列元素已被剔除完时,top()首元素为最后一次剩余的元素,首元素滞后
printf("gq优先队列的弹出3次首元素后的首元素:%d\n\n",gq.top());
//优先队列元素已被剔除完时,top()首元素为最后一次剩余的元素,首元素滞后
printf("q队列的弹出3次首元素后的首元素:%d 尾元素:%d\n\n",q.front(),q.back());
//队列元素已被剔除完时,back()尾元素为最后一次剩余的元素,尾元素滞后
printf("用了【greater<int>】的优先队列逆序排列,默认大的在前,逆序小的在前\n\n");
printf("pq优先队列最后剩下的元素量:%d\n\n",pq.size());
//证实现在的优先队列是没有元素的了
printf("q队列最后剩下的元素量:%d\n\n",q.size());
//证实现在的队列是没有元素的了
printf("pq优先队列用empty()检测是否已空:%d\n\n",pq.empty());//%d输出 1空 0非空
printf("q队列用empty()检测是否已空:%d\n\n",q.empty());//%d输出 1空 0非空
/*
优先队列用pq.front();会报错
队列用q.top();会报错
*/
printf("【栈后进先出】\n\n");
stack<int> s;
s.push(1);
printf("第1次插入后->栈顶元素:%d\n\n",s.top());
s.push(2);
printf("第2次插入后->栈顶元素:%d\n\n",s.top());
s.push(3);
printf("第3次插入后->栈顶元素:%d\n\n",s.top());
//形成的栈的元素顺序是3 2 1,也是按3 2 1的顺序移除的
s.pop();
printf("第1次移除后->栈顶元素:%d\n\n",s.top());
s.pop();
printf("第2次移除后->栈顶元素:%d\n\n",s.top());
s.pop();
//printf("第3次移除后->栈顶元素:%d\n\n",s.top());若如此,则空行无值输出
if(s.size()==0) printf("size为零,栈已空\n\n");
if(s.empty()==1) printf("empty为真,栈已空\n\n");
return 0;
}
运行结果如下
上一篇: 详细分析二分查找算法
下一篇: 通过定位查询本网站附近的店铺距离
推荐阅读
-
#2020寒假集训#C++STL-string代码笔记
-
#2020寒假集训#C++STL-algorithm代码笔记
-
#2020寒假集训#C++STL-map代码笔记
-
#2020寒假集训#C++STL-vector代码笔记
-
#2020寒假集训#树形入门(Tree)代码笔记
-
#2020寒假集训#C++STL-set代码笔记
-
#2020寒假集训#C++STL-queue、priority_queue和stack代码笔记
-
#2020寒假集训#最短路入门(Floyd弗洛伊德 和 Dijkstra迪杰斯特拉 算法)代码笔记
-
#2020寒假集训#数论入门(Number Theory)代码笔记
-
#2020寒假集训#单调队列与单调栈入门(Humdrum Queue and Monotonic stack)代码笔记