#2020寒假集训#C++STL-queue、priority_queue和stack代码笔记

#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;
}

运行结果如下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值