雙端隊列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 -->
        */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM