一、佇列(queue)
1、佇列的特點
佇列(queue)與棧一樣,是一種線性儲存結構,它具有如下特點:
【note】:
(1)佇列中的資料元素遵循「先進先出」(first in first out)的原則,簡稱fifo結構。
(2)在隊尾新增元素,在隊頭刪除元素。
佇列在棧在計算機中應用相當廣泛,包括廣度優先搜尋、cpu的作業排程、緩衝區等等。
2、佇列的相關概念
(1)隊頭( front() )與隊尾( back() ): 允許元素插入的一端稱為隊尾,允許元素刪除的一端稱為隊頭。
(2)入隊( push_back() ):佇列的插入操作。
(3)出隊( pop_front() ):佇列的刪除操作。
二、環形佇列
如果使用順序表作為佇列的話,當處於右圖狀態則不能繼續插入新的隊尾元素,否則會因為陣列越界而導致程式**被破壞。
由此產生了由鍊錶實現的迴圈佇列,只有佇列未滿時才可以插入新的隊尾元素,從而解決了無法判斷佇列是否溢位的問題。
(1)普通佇列判斷空或滿:front == rear, rear == max_size - 1;
(1)迴圈佇列判斷空或滿:front == rear, (rear + 1) % max_size == 0;
三、雙端佇列(deque)
雙端佇列是一種可以在兩端做插入和刪除操作的佇列,而且插入和刪除的速度很快;但是在內部進行插入和刪除操作,效能不及list。
(1)隊頭: front() , 隊尾:back()
(2)隊頭入隊:push_front() , 隊尾入隊:push_back()
(3)隊頭出隊: pop_front() , 隊尾出隊:pop_back()
四、佇列的應用之滑動視窗求最大值
有乙個整型陣列 arr 和乙個大小為 w 的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置。 返回乙個長度為n-w+1的陣列res,res[i]表示每一種視窗狀態下的最大值。 以陣列為[4,3,5,4,3,3,6,7],w=3為例。
因為第乙個視窗[4,3,5]的最大值為5,第二個視窗[3,5,4]的最大值為5,第三個視窗[5,4,3]的最大值為5。第四個視窗[4,3,3]的最大值為4。第五個視窗[3,3,6]的最大值為6。第六個視窗[3,6,7]的最大值為7。
所以最終返回[5,5,5,4,6,7]。
給定整形陣列arr及它的大小n,同時給定w,請返回res陣列。保證w小於等於n,同時保證陣列大小小於等於500。
測試樣例:
[4,3,5,4,3,3,6,7],8,3
返回:[5,5,5,4,6,7]
1、思路
我們用乙個雙向佇列deque來解決該問題。
1. 如果新來的值比佇列尾部的數小,那就追加到後面,因為它可能在前面的最大值劃出視窗後成為最大值。
2. 如果新來的值比尾部的大,那就刪掉尾部(因為有更大的在後面,所以它不會成為最大值,劃出也是它先劃出,不影響最大值),再追加到後面,迴圈下去保證次最大值總是緊鄰隊頭元素。
3. 如果追加的值比的索引跟佇列頭部的值的索引超過視窗大小,那就刪掉頭部的值
4. 其實這樣每次佇列的頭都是最大的那個。
2、demo
#include
using
namespace std;
vector<
int>
fun(
const vector<
int>
&vec,
const
int&n,
const
int&w)
}return res;
}int
main
(int argc,
char
const
*argv)
;int a =8;
int b =3;
vector<
int> v2 =
fun(v1, a, b)
;for
(const
auto v : v2)
cout << v << endl;
system
("pause");
return0;
}
滑動視窗的最大值 佇列的最大值
請定義乙個佇列並實現函式max得到佇列裡的最大值,要求函式max push back和 pop front的時間複雜度都是o 1 在佇列中維護乙個儲存最大值的佇列,當pop和push操作的同時也對最大值佇列進行維護。當彈出的時佇列中的最大值時,也彈出最大值佇列的頭,當壓入新值時,對最大值佇列從後向前...
滑動視窗最大值
題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 幾個注意點 利用雙端佇列實現,如果後者比前者大,前者丟擲,後者進,如果比前者小,壓入佇列,判斷隊頭是否過期,這就需...
滑動視窗最大值
給定乙個陣列和滑動視窗的大小,請找出所有滑動視窗裡的最大值。public class 滑動視窗的最大值 if num.length size size 1 用來儲存可能是滑動視窗最大值的數字的下標 linkedlist indexdeque newlinkedlist for int i 0 i s...