1. 程式人生 > >佇列與優先佇列的總結

佇列與優先佇列的總結

佇列

           是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

          佇列的資料元素又稱為佇列元素。在佇列中插入一個佇列元素稱為入隊,從佇列中刪除一個佇列元素稱為出隊。因為佇列只允許在一端插入,在另一端刪除,所以只有最早進入佇列的元素才能最先從佇列中刪除,故佇列又稱為先進先出(FIFO—first in first out)

 c++佇列queue模板的定義在<queue>標頭檔案中,queue 模板類需要兩個模板

引數,一個是元素型別,一個容器型別,元素型別是必要的,容器型別是可選的,預設為deque 型別。

C++佇列Queue類成員函式有:

back() 返回最後一個元素

empty() 如果佇列空則返回真

front() 返回第一個元素

pop() 刪除第一個元素

push() 在末尾加入一個元素

size() 返回佇列中元素的個數

例如0-5,共5個元素,我們對其進行入隊出隊操作:

程式碼例:

#include<queue>
#include<cstdio>
using namespace std;
int main()
{
    queue <int> myQ;
    printf("現在佇列中元素個數%d\n\n",myQ.size());
    for(int i =0; i<5 ; i++)
    {
        myQ.push(i);//入隊
    }
    for(int i=0; !myQ.empty(); i++)
    {
        printf("佇列剩餘元素個數為:%d\n\n",myQ.size());
        printf("佇列的第一個元素為:%d   佇列最後一個元素為:%d\n\n",myQ.front(),myQ.back());
        myQ.pop();//出隊
    }
    myQ.push(8);//在佇列的最後一位新增一個元素
    printf("佇列壓入的元素為:%d\n",myQ.back());
    return 0;
}

輸出結果為

優先佇列:C++優先佇列類似佇列,但是在這個資料結構中的元素按照一定順序排列。

成員函式有:
1.empty() 如果優先佇列為空,則返回真
2.pop() 刪除第一個元素
3.push() 加入一個元素
4.size() 返回優先佇列中擁有的元素的個數
5.top() 返回優先佇列中有最高優先順序的元素
例程式碼:

#include<cstdio>
#include<queue>
using namespace std;
int main()
{
    priority_queue<int>Q;
    for(int i=1;i<=5;i++)
    {
        int x;
        scanf("%d",&x);//壓入輸入的元素
        Q.push(x);
    }
    for(int i=1;i<=5;i++)
    {
        printf("優先佇列中最大元素為:%d\n\n",Q.top());//由於沒有定義優先順序,優先佇列將按照元素大小來確定優先順序
        Q.pop();
    }
    return 0;
}

我們輸入亂序的一堆數,在輸出的時候我們可以看到,這些數是按照誰最大誰先輸出

現在對優先佇列進行自定義安排優先順序,這裡我們自定義了兩個佇列,它們的優先順序相反

程式碼:

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
    int time;
    friend bool operator < (node n1, node n2)
    {
        return n1.time<n2.time;//自定義優先順序從大到小
    }
} a;
struct node1
{
    int time;
    friend bool operator <(node1 n1,node1 n2)
    {
        return n1.time>n2.time;//從小到大
    }
} b;
int main()
{
    priority_queue<node>Q;
    priority_queue<node1>Q1;
    int i;
    for(i=0; i<5; i++)
    {
        int x;
        scanf("%d",&x);
        a.time=x;
        b.time=x;
        Q.push(a);
        Q1.push(b);
    }
    printf("佇列1中優先順序輸出順序為:\n");
    while(!Q.empty())
    {
        a=Q.top();
        Q.pop();
        printf("%d ",a);
    }
    printf("\n");
    printf("佇列2中優先順序輸出順序為:\n");
    while(!Q1.empty())
    {
        b=Q1.top();
        Q1.pop();
        printf("%d ",b);
    }
    return 0;
}

執行結果