資料結構 佇列及其應用

2021-08-20 12:14:10 字數 2520 閱讀 1831

除了順序容器外,標準庫還定義了三個順序容器介面卡,stack、queue和priority_queue。本質上乙個介面卡是一種機制,能使某種事物的行為看起來像另外一種事物一樣。乙個容器介面卡接收一種已有的容器型別,使其行為看起來像另外一種不同型別一樣。

本文主要介紹佇列及其應用,棧及其應用參考棧及其應用 ,優先順序佇列參考

佇列

/*queue預設基於deque實現,也可以使用list或vector事項*/

q.pop(); //刪除隊首元素,並返回

q.empty();

q.push();

q.front();

q.back();

1、銀行服務模擬

以銀行這一典型場景為例,使用佇列實現顧客服務的排程優化。

struct customer

;/*模擬銀行中接收服務的整個過程,根據銀行所設視窗的數量相應的建立多個佇列,以單位時間為間隔反覆迭代直至下班*/

void simulate ( int nwin, int servtime )

for ( int i = 0; i < nwin; i++ ) //分別檢查

if ( !windows[i].empty() ) //各非空佇列

if ( -- windows[i].front().time <= 0 ) //隊首顧客的服務時長減少乙個單位

windows[i].pop(); //服務完畢的顧客出列,由後繼顧客接替

} //for

delete windows; //釋放所有佇列(此前,~list()會自動清空佇列)

}/*每乙個時刻都有一位顧客按一定的概率抵達,隨機確定所辦業務的時長之後,歸入某一最優的佇列*/

int bestwindow ( queuewindows, int nwin ) //佇列最短者

return optiwin; //返回

}

2、使用兩個棧實現乙個佇列

題目:用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

class solution

int pop()

}int &j=stack2.top();

stack2.pop();

return j;

}private:

stack

stack1;

stack

stack2;

};

上述的基本步驟:當stack2中不為空時,在stack2中的棧頂元素時最先進入佇列的元素,可以彈出。如果stack2為空時,我們把stack1中的元素逐個彈出壓入棧stack2中。

3、滑動視窗的最大值

題目:給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為; 針對陣列的滑動視窗有以下6個: , , , , , 。

對於這種如果採用蠻力演算法很容易就可以解決:可以掃瞄每乙個滑動視窗的所有數字並找出其中的最大值。如下:

class solution 

max.push_back(m);}}

return max;

}};

其實滑動視窗可以看成是乙個佇列,如果我們可以在佇列中找到他的最大數,就可以解決。在棧及其應用 中的說明了如何實現用o(1)的時間得到最小值的棧,並且上面實現了用兩個棧實現乙個佇列,綜合,我們可以把佇列用兩個棧實現,可以用o(1)時間找到棧中的最大值,就可以用0(1)時間找到佇列的最小值。

這裡使用另外一種思路:並不把滑動視窗的每個數值都存入佇列中,而是只把有可能成為滑動視窗最大的值存入乙個雙埠佇列。

class solution 

for(int i=size;i//從後面依次彈出佇列中比當前num值小的元素,同時也能保證佇列首元素為當前視窗最大值下標

while(index.size()&&num[i]>=num[index.back()])

index.pop_back();

//當當前視窗移出隊首元素所在的位置,即隊首元素座標對應的num不在視窗中,需要彈出

上述**中,index是乙個兩端開口的佇列,用來儲存有可能是滑動視窗最大值的數字的下標。在存入乙個數字之前,首先要判斷佇列裡已有的數字是否小於待存入數字。如果小於將把它們從佇列的尾部刪除,這些數字已經不可能是視窗的最大值。同時如果佇列頭部的數字已經從視窗滑出,滑出的數字也要從佇列的頭部刪除。

資料結構及其應用

在程式的世界裡,任何問題或技術的落腳點都是資料結構,所以在學習或研究這些問題或技術時,要注重理解底層或實現過程中所採用的資料結構。本系列會將常用的資料結構進行總結,首先看下樹。一 樹常用的樹形資料結構有 搜尋二叉樹 平衡二叉樹 紅黑樹 完全二叉樹 1.搜尋二叉樹 父子節點滿足大小關係,左子樹都小於根...

資料結構 回文判斷及其應用

要求 採用棧和佇列的方法檢測並輸出乙個單詞是否為回文 include include include 佇列 typedef char qelemtype typedef struct sqqueue 棧 define maxsize 200 typedef struct stack 佇列 void ...

資料結構 鏈式佇列及其操作集

佇列基本操作 initqueue q 初始化佇列,構造乙個空佇列q。queueempty q 判佇列空,若佇列q為空返回true,否則返回false。enqueue q,x 入隊,若佇列q未滿,則將x加入使之成為新的隊尾。dequeue q,x 出隊,若佇列q非空,則刪除隊頭元素,並用x返回。get...