C++学习之路 STL中栈,队列,优先队列

STL 栈 stack

头文件: #include<stack>

声明方式: stack<元素类型,存储容器类型>栈名(xxx);

主要操作:

1.xxx.push(元素)     将于素压入栈

2.xxx.top()                 取出栈顶元素,(不从栈中删除)

3.xxx.pop()     将栈顶元素删除

4.xxx.size()      返回栈中元素个数

5.xxx.empty()   栈空返回true,否则返回false

#include<iostream>
#include<stack>
using namespace std;
stack<int>myStack;
int main(){
	for(int i=0;i<=9;i++){
		myStack.push(i);
	}
	cout<<"Stack Size: "<<myStack.size() <<endl;
	cout<<myStack.top()<<endl;//注意,此处栈顶元素并未弹出 
	cout<<"Stack Size: "<<myStack.size() <<endl;
	while(!myStack.empty()){
		cout<<myStack.top()<<endl;
		myStack.pop();
	}
	cout<<"Stack Size: "<<myStack.size() <<endl;
} 

STL 队列 queue:

头文件: #include<queue>

声明方式: queue<元素类型,存储容器类型>队列名;

主要操作:

1.xxx.front()            返回队首元素

2.xxx.push(元素)   元素入队操作

3.xxx.empty()         队列是否为空

4.xxx.pop()             弹出(清除)队首元素

5.xxx.back()           返回队尾元素

#include<iostream>
#include<queue>
using namespace std;
int main(){
	queue<int>myQueue;
	for(int i=0;i<=9;i++){
		myQueue.push(i);
	}
	cout<<"Queue Size: "<<myQueue.size()<<endl;
	cout<<myQueue.front()<<" "<<myQueue.back()<<endl;
	while(!myQueue.empty()){
		cout<<myQueue.front()<<endl; 
		myQueue.pop();
	}
	cout<<"Queue Size: "<<myQueue.size()<<endl;
	return 0;
}

STL 优先队列 priority_queue

头文件: #include<queue>

声明方式: priority_queue<元素类型,存储容器类型,自定义比较方式> pq;

主要操作:

1.pq.top() 返回队首元素(注意此处非front)

2.pq.pop() 删除队首元素

3.pq.empty() 判断队列是否为空

4.pq.push(元素) 将元素压入队列

5.pq.size()   返回当前队列中的元素

优先队列中默认元素由大到小排列,当然也可以自己定义比较函数

#include<iostream>
#include<queue>
using namespace std;
int main(){
	priority_queue<int>pq;//默认比较函数,将有大到小输出 
	for(int i=0;i<=9;i++){
		pq.push(i);
	}
	while(!pq.empty()){
		cout<<pq.top()<<" ";
		pq.pop();
	}
	cout<<endl;
}
当我们在做最短路等其他问题是需要用优先队列使最小值先输出这时就用到自定义比较函数,当然也可以用#include<functional>中的greater<元素类型>(由小到大排列,小的先输出),与之相反的 less<元素类型> 由大到小输出

#include<iostream>
#include<functional> 
#include<queue>
using namespace std;
int main(){
	priority_queue<int,vector<int>,greater<int> >pq;//注意使用greater时,添加容器类型,还有greater<int>" "> 用空格隔开 
	//priority_queue<int,vector<int>,less<int> >pq;//由大到小输出 
	for(int i=0;i<=9;i++){
		pq.push(i);
	}
	while(!pq.empty()){
		cout<<pq.top()<<" ";
		pq.pop();
	}
	cout<<endl;
}

自己编写自定义比较函数:

//重载"()"运算符 ,元素可以不为结构体类型,当然也可以为结构体类型 ,而"<"是在结构体中重载 
struct myComp{
	bool operator()(const int &a,const int &b){
		//元素由小到大排列,注意是">"   ,由大到小排列为"<" 
		return a>b;
	}
};
priority_queue<int,vector<int>,myComp >pq;

当元素为结构体时,可在结构体内重载''<"

方法一:

struct node{
	string name;
	int Id;
	//重载"<"   不能重载">",报错 
	bool operator<(const node &a)const{//const一个不能少 
		return a.Id<Id;//按照Id值由小到大排列,注意是a.Id<Id 若为Id<a.Id 则排序规则相反 ,以a.Id为标杆 
	}
};
方法二:
struct node{
	string name;
	int Id;
	friend bool operator<(const node &a, const node &b){//作为友员比较函数 ,重载"<" ,两个参数,注意排序顺序 
		//注意此时的比较a.Id<b.Id 使Id由大到小排列 
		return a.Id<b.Id;
	}
};
priority_queue<node>pq;
所以,当元素非结构体时,重载"()"运算符,当元素为结构体时,按方法一在结构体内重载“<”



如有异议,欢迎指正,谢谢

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值