一、雙端隊列的結構
deque的結構是由兩個數組組成的,暫且把這兩個數組稱作是1號數組和2號數組(Array_1、Array_2)
1號數組保存的是指向2號數組的指針,1號數組的初始大小為2,在2號數組滿的時候進行2倍擴容,初始化1號數組中間位置的指針指向2號數組Array_1[size/2]=Array_2;
2號數組保存的是deque的內容,2號數組有兩個指針,first和last,我們打這兩稱作頭指針和尾指針,deque的push_front()和push_back()就是對這兩個指針進行操作
first指針和last指針初始化的時候在2號數組的中間位置,*first=Array_2[max_size/2],*last=*(first+1);
Array_2數組的大小max_size取決於deque保存的數據類型sizeof(T)的大小,如果sizeof(T)>4096 max_size=1;否則max_size=4096/sizeof(T)
初始化之后的結構
/* <-- first Array_1[0] | | Array_1[1] | - - - - - - - - - - - Array_2 | last --> */
二、deque的擴容
首先deque是采取二倍擴容機制,並且是對1號數組Array_1進行擴容,擴容之后還是從數組中間位置開始使用,有以下幾種情況需要對1號數組進行擴容
假設1號數組的大小為size_1
1、first指針移動到Array_2的頭部位置,first指針所在的Array_2數組對應1號數組的下標i==0,last指針所在的Array_2對應的1號數組下標 j+1<size_1,這時候需要對Array_1進行2倍擴容
/* <-- first | Array_1[0] | - - - - - - - - - - - Array_2_1 Array_1[1] | - - - - - - - - - - - Array_2_0 | last --> */
2、last指針移動到Array_2的尾部位置,last指針所在的Array_2數組對應1號數組的下標i==size_1-1,first指針所在的Array_2對應的1號數組下標 j==0,這時候需要對Array_1進行2倍擴容
/* <-- first | Array_1[0] | - - - - - Array_2_1 Array_1[1] | - - - - - - - - - - - Array_2_0 | last --> */
當first指針或last指針指到Array_2數組的邊界位置,可以通過整體向上或向下移動騰出空間,那么可以不需要進行擴容
//整體向下移動一個位置,還是可以給first騰出一個位置的,所以可以不進行擴容 /* <-- first | Array_1[0] | - - - - - - - - - - - Array_2_2 Array_1[1] | - - - - - - - - - - - Array_2_1 Array_1[2] | - - - - - - - Array_2_0 | Array_1[3] | last --> */