欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#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-queue、priority_queue和stack代码笔记

相关标签: 2020寒假集训