1. 程式人生 > 實用技巧 >雙端佇列deque的初始化和擴容

雙端佇列deque的初始化和擴容

一、雙端佇列的結構

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 -->
        */