STL提供了3种特殊的数据结构:栈,队列与优先队列。
1.STL的栈
- 所谓栈就是符合“后进先出”规则的数据结构,(就像把东西放在一个没有盖子的桶子里面,要想取出底面的元素,必须先将上面的东西取出来,才能操作)
- STL中栈定义在头文件< stack>中
- 栈的声明:stack< int >s
- 栈的基本操作:push()和pop()实现元素的入栈和出栈操作,top()取栈顶元素(但不删除)
示例代码:
//实现功能:输入5个数存在栈中,并将其输出
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int i,t;
stack<int> s;
for(i=0;i<5;i++)
{
cin>>t;
s.push(t);
}
for(i=0;i<5;i++)
{
cout<<s.top()<<" ";
s.pop();
}
return 0;
}
结果截图:
2.STL的队列
- 队列是一种“先进先出”的数据结构。
- 头文件:< queue>,声明:queue< int > s;
- 基本操作:push()和pop()进行元素的入队和出队操作,front()取队首元素(但不删除)。
示例代码:
//实现功能:输入5个数存在队列中,并将其输出
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int i,t;
queue<int> s;
for(i=0;i<5;i++)
{
cin>>t;
s.push(t);
}
for(i=0;i<5;i++)
{
cout<<s.front()<<" ";
s.pop();
}
return 0;
}
结果截图:
3.优先队列
- 一种行为像队列的抽象数据类型
- 遵循优先级优先原则,即:先出队列的是队列中优先级最高的元素 ,3对于自定义类型,也可以组成优先队列,但是必须为每一个元素自定义一个优先级,类似于sort。
- 头文件:< queue >
- 常见的2种声明:(1.)越小的整数优先级越低的优先队列:priority_queue< int> s;(2.)越小的数优先级越大的优先队列: priority_queue< int,vector< int>,greater< int> >,注意:最后2个“>”号不要写在一起,否则有的编译器会误以为是“>>”会出错。
- 基本操作: push()和pop()进行元素的入队和出队,top()取队首元素但是不删除
- q.empty() 如果队列为空,则返回true,否则返回false
示例代码:
//实现功能:输入5个数存在优先队列中,并将其输出
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int i,t;
priority_queue<int>s;
for(i=0;i<5;i++)
{
cin>>t;
s.push(t);
}
while(!s.empty())
{
cout<<s.top()<<" ";
s.pop();
}
return 0;
}
结果截图:
优先队列与结构体的使用
在某一个结构体中,例如:
struct node
{
int x,y;
}arr[5];
若是要按照x的值来排序,需要在结构体中重载运算符,可以在结构体中重载,也可以在结构体外重载。
结构体内部重载:
struct node
{
int x,y;
bool operator< (const node& t)const
{
return x>t.x;
//使得优先队列中小值位于列首
}
}arr[5];
结构体外重载:
bool operator<(const node& a,const node& b)
{
return a.x>b.x;
}
完整代码:
//实现功能:结构体中优先队列,
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int x,y;
bool operator< (const node& t)const
{
return x>t.x;
//使得优先队列中小值位于列首
}
}arr[5];
int main()
{
int i,t;
priority_queue<node> q;
for(i=0;i<5;i++)
{
cin>>arr[i].x>>arr[i].y;
q.push(arr[i]);
}
for(i=0;i<5;i++)
{
node temp=q.top();
cout<<temp.x<<" "<<temp.y<<endl;
q.pop();
}
return 0;
}