STL栈队列优先队列—————基础知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL栈队列优先队列—————基础知识相关的知识,希望对你有一定的参考价值。

0基本特点:后进先出(LIFO)

注意:

不一定最先进栈的最后出栈,只要保证是栈顶元素出栈就行!

当栈中存在一个元素时,top=0,因此通常把空栈的判定条件定为top= - 1;

 STL 中栈的使用方法:

头文件:#include <stack>

基本操作:

push(x) 将x加入栈中,即入栈操作

pop() 出栈操作(删除栈顶),只是出栈,没有返回值

top() 返回第一个元素(栈顶元素)

size() 返回栈中的元素个数

empty() 当栈为空时,返回 true

 
STL 中队列的使用(queue)
#include <queue>

基本操作:

push(x) 将x压入队列的末端

pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值

front() 返回第一个元素(队顶元素)

back() 返回最后被压入的元素(队尾元素)

empty() 当队列为空时,返回true

size() 返回队列的长度

 

STL 中优先队列的使用详细介绍(priority_queu)

  头文件: #include <queue>

基本操作:

empty() 如果队列为空返回真

pop() 删除对列首元素

push() 加入一个元素

size() 返回优先队列中拥有的元素个数

top() 返回优先队列首元素

优先队列的两种生声明方式:

std::priority_queue<T> pq;
std::priority_queue<T, std::vector<T>, cmp> pq;

 

 

 

在默认的优先队列中,优先级高的先出队。

标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系。

 (1)优先队列的第一种用法,这是最常用的默认的优先级用法,也就是优先级高的先出队列,例如说一个int优先队列,那么出队的时候就是int大的先出队列。

下面给出一个例子:

  1. #include <iostream>  
  2. #include <queue>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     priority_queue<int> q;  
  7.     for(int i = 1;i <= 5;i++)  
  8.     {  
  9.         q.push(i);  
  10.     }  
  11.     for(int i = 0;i < 5;i++)  
  12.     {  
  13.         cout<<q.top()<<endl;  
  14.         q.pop();  
  15.     }  
  16.     return 0;  
  17. }  

(2)那么如果想要优先队列中低优先级的元素先出队列,怎么办呢? --- 自定义优先级

①方法一:我们可以传入一个比较函数,使用functional头文件中的greater函数对象作为比较函数

     注意:首先要添加头文件:#include <functional>

    priority_queue< int,vector<int>,greater<int> > q; // 注意:> > 误写成>> 会报错

    这样我们就创建了一个低优先级元素先出对列的优先队列。

    修改上面的例子,运行,就会发现,输出的顺序变成了:1 2 3 4 5。

    当然,与greater相对的less,如果传入less这个比较函数,那么就是高优先级元素先出队列了。

     priority_queue< int,vector<int>,less<int> > q; 

     priority_queue<int> q;

    以上创建的优先队列是相同的。

②方法二:自己实现比较函数

  1. struct cmp1  
  2. {  
  3.     bool operator ()(int x,int y)  
  4.     {  
  5.         return x>y; //小值优先  
  6.     }  
  7. }; 

      priority_queue<int,vector<int>,cmp1 > q;这样就创建了一个小值元素先出队列的优先队列,这里的 cmp1 作用就相当于 greater

同理我们可以写出:

  1. struct cmp2  
  2. {  
  3.     bool operator ()(int x,int y)  
  4.     {  
  5.         return x<y; //大值优先  
  6.     }  
  7. };  

(3)假如优先队列中的元素是一个结构对象或者是类对象,那么如何重新自定义其优先级比较呢?

例子一:定义一个结构体,这个结构体只有一个元素 x 。

①低优先级元素先出队列,也就是x值小的先出队列。

  1. struct number1  
  2. {  
  3.     int x;  
  4.     bool operator < (const number1 &a) const  
  5.     {  
  6.         return x>a.x;//小值优先  
  7.     }  
  8. };  
struct number1
{
    int x;
    bool operator < (const number1 &a) const
    {
        return x>a.x;//小值优先
    }
};

 

  1. number1 num1[5];  
  2.     priority_queue<number1>q;  
  3.     for(int i = 1; i <= 5; i++)  
  4.     {  
  5.         num1[i].x = i;  
  6.         q.push(num1[i]);  
  7.     }  
  8.     for(int i = 1; i <= 5; i++)  
  9.     {  
  10.         cout<<q.top().x<<endl;  
  11.         q.pop();  
  12.     }  
number1 num1[5];
    priority_queue<number1>q;
    for(int i = 1; i <= 5; i++)
    {
        num1[i].x = i;
        q.push(num1[i]);
    }
    for(int i = 1; i <= 5; i++)
    {
        cout<<q.top().x<<endl;
        q.pop();
    }

输出: 1 2 3 4 5

②高优先级元素先出队列,也就是x值大的先出队列。

 
  1. struct number2  
  2. {  
  3.     int x;  
  4.     bool operator < (const number2 &a) const  
  5.     {  
  6.         return x<a.x;//大值优先  
  7.     }  
  8. };  
struct number2
{
    int x;
    bool operator < (const number2 &a) const
    {
        return x<a.x;//大值优先
    }
};


注意到:结构体中重载的运算符只可以是 <, 因为标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系,如果重载 > ,那么会编译错误。

 

例子二:在上面的例子中,我们是将 结构体中的 x 的大小当做是优先级比较值了。下面给出另一例子,这个例子更具有一般性。

 

  1. struct node  
  2. {  
  3.     friend bool operator < (node n1, node n2)  
  4.     {  
  5.         return n1.priority < n2.priority;  
  6.     }  
  7.     int priority;  
  8.     int value;  
  9. };  
struct node
{
    friend bool operator < (node n1, node n2)
    {
        return n1.priority < n2.priority;
    }
    int priority;
    int value;
};


在这个结构体中,priority表征优先级值。

 

 

  1. priority_queue<node> qn;  
  2.     node b[5];  
  3.     b[0].priority = 6; b[0].value = 1;  
  4.     b[1].priority = 9; b[1].value = 5;  
  5.     b[2].priority = 2; b[2].value = 3;  
  6.     b[3].priority = 8; b[3].value = 2;  
  7.     b[4].priority = 1; b[4].value = 4;  
  8.   
  9.     for(int i = 0; i < 5; i++)  
  10.         qn.push(b[i]);  
  11.     cout<<"优先级"<<‘\t‘<<"值"<<endl;  
  12.     for(int i = 0; i < 5; i++)  
  13.     {  
  14.         cout<<qn.top().priority<<‘\t‘<<qn.top().value<<endl;  
  15.         qn.pop();  
  16.     }  
priority_queue<node> qn;
    node b[5];
    b[0].priority = 6; b[0].value = 1;
    b[1].priority = 9; b[1].value = 5;
    b[2].priority = 2; b[2].value = 3;
    b[3].priority = 8; b[3].value = 2;
    b[4].priority = 1; b[4].value = 4;

    for(int i = 0; i < 5; i++)
        qn.push(b[i]);
    cout<<"优先级"<<‘\t‘<<"值"<<endl;
    for(int i = 0; i < 5; i++)
    {
        cout<<qn.top().priority<<‘\t‘<<qn.top().value<<endl;
        qn.pop();
    }

 

输出结果为:
优先级  值
9          5
8          2
6          1
2          3
1          4

 

以上是关于STL栈队列优先队列—————基础知识的主要内容,如果未能解决你的问题,请参考以下文章

C++:STL——栈队列和优先级队列的模拟实现

栈,队列与优先队列

STL测试3)优先级队列实现二叉堆

学习:STL----优先队列

STL之堆和优先队列

STL容器之优先队列(转)