隊列---面試知識點整理

數據結構包括邏輯結構和存儲結構。前端

邏輯結構包括集合、線性結構、樹形結構、圖形結構。json

存儲結構包括順序存儲結構、鏈式存儲結構、索引存儲結構、哈希存儲結構。後端

「線性表」中的「線性」是邏輯結構的概念,是指數組

(1)開始結點和終端結點都是惟一的;瀏覽器

(2)除了開始結點和終端結點,其他結點都有且僅有一個直接前驅,有且僅有一個直接後繼。數據結構

「循環鏈表」中的「鏈表」是存儲結構的概念,是指性能

不要求邏輯上相鄰的結點在物理上也相鄰,結點間的邏輯關係是由附加的指針字段表示的。指針

綜上 ,循環鏈表也是鏈表的一種,鏈表知足線性表的條件,因此循環鏈表天然也屬於線性表。xml

 

棧,它是一種運算受限的線性表。其限制是僅容許在表的一端進行插入和刪除運算。這一端被稱爲棧頂,相對地,把另外一端稱爲棧底。排序

隊列,是一種特殊的 線性表  ,特殊之處在於它只容許在表的前端( front )進行刪除操做,而在表的後端( rear )進行插入操做,和棧同樣,隊列是一種操做受限制的線性表。進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭

 

遞歸是棧實現的。棧是先進後出,也就是上次遞歸調用的時候,保存在棧頂, 在返回的時候出棧,因此是遞歸是依靠棧實現的.

PS: 非遞歸形式的深度優先搜索要用棧,而廣度優先使用了隊列。

 

某帶鏈的隊列初始狀態爲 front=rear=NULL 。通過一系列正常的入隊與退隊操做後, front=rear=10 。該隊列中的元素個數爲(  )

往隊列的隊尾插入一個元素爲入隊,從隊列的排頭刪除一個元素稱爲退隊。初始時 front=rear=0 , front 老是指向隊頭元素的前一位置,入隊一次 rear+1 ,退隊一次 front+1 。隊列隊頭隊尾指針相同時隊列爲空。而帶鏈的隊列,因爲每一個元素都包含一個指針域指向下一個元素,當帶鏈隊列爲空時 front=rear=Null ,插入第 1 個元素時, rear+1 指向該元素, front+1 也指向該元素,插入第 2 個元素時 rear+1 , front 不變,刪除 1 個元素時 front+1 。即 front=rear 不爲空時帶鏈的隊列中只有一個元素。

 

當隊列中只有一個元素時,出隊後須要清空對頭和隊尾指針。

 

線性結構與非線性結構,主要看元素之間的關係,若是是一對一的關係則是線性表,若是不是一對一的關係則是非線性表。

 

循環隊列中,因爲入隊時尾指針向前追趕頭指針;出隊時頭指針向前追趕尾指針,形成隊空和隊滿時頭尾指針均相等。所以,沒法經過條件front==rear來判別隊列是"空"仍是"滿"。

解決這個問題的方法至少有兩種:

① 另設一布爾變量以區別隊列的空和滿;

②另外一種方式就是數據結構經常使用的: 隊滿時:(rear+1)%n==front,n爲隊列長度(所用數組大小),因爲rear,front均爲所用空間的指針,循環只是邏輯上的循環,因此須要求餘運算.

 

隊列元素=(尾指針-頭指針+隊列容量)%隊列容量。循環隊列中的元素個數隨隊頭指針與隊尾指針的變化而動態變化

 

雙端隊列是一種同時具備隊列和棧的性質的一種數據結構,在隊列的兩頭均可以進行插入和刪除的操做;輸入受限的雙端隊列是指只能從隊列一端輸入,能夠從兩端輸出的雙端隊列;同理,輸出受限的雙端隊列是指只能從隊列一端輸出,能夠從兩端輸入的雙端隊列;若是雙端隊列容許從一端輸入,從一端輸出,則是普通的隊列,若是雙端隊列只容許從一端輸入和輸出則是棧。所以說雙端隊列同時具備隊列和棧兩種數據結構的性質。

 

Redis和kafka都是常見的開源隊列。

 

隊列是一種操做受限 的結構,即只能在隊首刪除和隊尾插入

 

棧是解決封閉對應問題的有效方法。

好比在解析XML中,遇到一個<demo>標籤(左標籤)就入棧,遇到其子標籤的左標籤(如<subdemo>)一樣入棧。遇到右標籤(如</subdemo>或</demo>)就校驗棧頂標籤是否與該右標籤對應,能對應就出棧,不能對應則說明標籤不對稱,是無效的XML文件

 

存儲結構是數據的邏輯結構用計算機語言的實現,常見的存儲結構有: 順序存儲 , 鏈式存儲 , 索引存儲 ,以及 散列存儲 。其中散列所造成的存儲結構叫 散列表(又叫哈希表) ,所以哈希表也是一種存儲結構。棧只是一種抽象數據類型,是一種邏輯結構,棧邏輯結構對應的順序存儲結構爲順序棧,對應的鏈式存儲結構爲鏈棧,循環隊列是順序存儲結構,鏈表是線性表的鏈式存儲結構

 

用循環鏈表表示隊列,一定有鏈表的頭結點,題目中說鏈表設有尾指針。所以入隊操做在鏈表尾插入,直接插入再尾指針指向的節點後面,時間複雜度是常數級的;出隊操做在鏈表表頭進行,也就是刪除表頭指向的節點,時間複雜度也是常數級的。

 

在棧中,棧底保持不變,有元素入棧,棧頂指針增長;有元素出棧,棧頂指針減少。在循環隊列中,隊頭指針和隊尾指針的動態變化決定隊列的長度。在循環鏈表中,前一個結點指向後一個結點,而最後一個結點指向頭結點,只有頭結點是固定的。線性鏈表中,因爲前一個結點包含下一個結點的指針,尾結點指針爲空,要插入刪除元素,只須要改變相應位置的結點指針便可,頭指針和尾指針沒法決定鏈表長度。

 

循環隊列解決的是「假溢出」問題,可是仍然會出現真正的溢出問題。假溢出指的是下標溢出,真溢出指的是空間溢出。

 

DFS是深度優先搜索,是後進先出,因此須要藉助於一個棧來實現。而BFS,也就是廣度優先搜索纔是藉助一個隊列來實現

 

循環隊列,其隊頭指針爲front,隊尾指針爲rear;循環隊列長度爲N。其隊內有效長度爲?(假設隊頭不存放數據)    (rear - front + N) % N

 

下面數據結構可以支持隨機的插入和刪除操做、並具備較好的性能的是____。

1,數組是在定義的時候申請一塊連續的內存空間,訪問某個元素只須要經過下標就能夠,可是隨機插入和刪除都要移動後面全部的元素,因此,數組確定不行;

2,鏈表,是非連續的空間,經過指針訪問,因此隨機插入和刪除經過指針之間的操做很方便,可是若是要查詢一個數的時候仍是得依次便利,可是題目問的是隨機插入和刪除,因此,鏈表能夠;

3,棧,全部的操做都是在棧頂,若是要隨機插入或者刪除某個數也必須依次對其餘數就行操做,因此,棧也排除;

4,隊列,經過隊頭和隊尾指針進行讀入數據和刪除數據,若是直接在隊尾添加數據很方便,可是,題目中是隨機,因此,隊列排序;

5,哈希表經過鍵值對操做,只要知道相關的key很容易就行讀取和刪除,插入某個元素也經過key很方便,因此,哈希表確定能夠;

 

棧的常見應用:瀏覽器歷史紀錄,Android中的最近任務,Activity的啓動模式,CPU中棧的實現,Word自動保存,解析計算式,解析xml/json

 

循環隊列的相關條件和公式:  

隊尾指針是rear,隊頭是front,其中QueueSize爲循環隊列的最大長度  

1.隊空條件:rear==front  

2.隊滿條件:(rear+1) %QueueSIze==front  

3.計算隊列長度:(rear-front+QueueSize)%QueueSize  

4.入隊:(rear+1)%QueueSize  

5.出隊:(front+1)%QueueSize

相關文章
相關標籤/搜索