STL之栈stack,队列queue以及优先队列

来源:互联网 发布:mac虚拟机和双系统 编辑:程序博客网 时间:2024/05/19 18:37

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;} 
原创粉丝点击