1. 常用數據結構有哪些
數據結構分為8類有:數組、棧、隊列、鏈表、樹、散列表、堆、圖。數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成 。
1、數組
數組是可以再內存中連續存儲多個元素的結構,在內存中的分配也是連續的,數組中的元素通過數組下標進行訪問,數組下標從0開始。例如下面這段代碼就是將數組的第一個元素賦值為 1。
2、棧
棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。 棧的特點是:先進後出,或者說是後進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。
3、隊列
隊列與棧一樣,也是一種線性表,不同的是,隊列可以在一端添加元素,在另一端取出元素,也就是:先進先出。從一端放入元素的操作稱為入隊,取出元素為出隊。
4、鏈表
鏈表是物理存儲單元上非連續的、非順序的存儲結構,數據元素的邏輯順序是通過鏈表的指針地址實現,每個元素包含兩個結點,一個是存儲元素的數據域 (內存空間),另一個是指向下一個結點地址的指針域。根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等。
5、樹
樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具有層次關系的集合。把它叫做 「樹」 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。
6、散列表
散列表,也叫哈希表,是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素。
7、堆
堆是一種比較特殊的數據結構,可以被看做一棵樹的數組對象,具有以下的性質:堆中某個節點的值總是不大於或不小於其父節點的值;堆總是一棵完全二叉樹。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
8、圖
圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
2. 數據結構——優先隊列
優先隊列顧名思義,就是優先權最大的排在隊列的頭部,而優先權的判斷是根據對象的compare方法比較獲取的,保證根節點的優先順序一定比子節點的優先順序大。所以放入到優先隊列的元素要麼實現了Comparable介面,要麼在創造這個優先隊列時,指定一個比較器。
普通的隊列是一種先進先出的數據結構,元素在隊列尾追加,而從隊列頭刪除。在優先隊列中,元素被賦予優先順序。當訪問元素時,具有最高優先順序的元素最先刪除。優先隊列具有最高級先出 (first in, largest out)知桐的行為特徵。通常採用堆數據結構來實現。
在Java中也實現了自己的優先隊列 java.util.PriorityQueue ,與我們自己寫的不同之處在於,Java中內置的為最小堆,然後就是一些函數名不一樣,底層還是維護了一個Object類型的數組,大家余鬧可以戳戳看有什麼不豎猛罩同,另外如果想要把最小堆變成最大堆可以給PriorityQueue傳入自己的比較器。
參考:
https://blog.csdn.net/love905661433/article/details/82989608
https://www.cnblogs.com/wmyskxz/p/9301021.html
3. 棧、隊列中「先進先出」,「後進先出」的含義
先進先出(FIFO,first-in,first-out)為處理從隊列或堆棧發出的程序工作要求的一種方法,它使最早的要求被最先處理。後進先出,從棧中取出數據項的順序與將它們插入棧的順序相反。
FIFO由6個功能塊組成,它們是存儲體、寫計數器(WP)、讀計數器(RP)、滿邏輯IN_FULL、空邏輯IN_EMPTY和選擇邏輯SELECT。陵伍穗這是一個同步的FIFO。在時鍾脈沖的上升沿作用下,當WR=0且FULL=0時,DIN的數據將壓入FIFO堆棧。
在通常情況下,RP所指出的單元內容總是放於DOUT的輸出數據線上,只是在RD=0且EMPTY=0時,RP的內容才改變而指向FIFO的下一個單元,下一個單元的內容替換當前內容並從DOUT輸出橘弊。
應注意,在任何時候DOUT上都有一個數據輸出,而不像RAM那樣,只有在讀有效時才有數據輸出,平時為三態輸出。
(3)先進數據結構是什麼擴展閱讀
LIFO與FIFO存儲器一樣沒有外部地址碼輸入端,而是由內部的指針指示存取的地址。LIFO只需一個指針。復位時,指針指向最末一個單元(棧底)。每寫入一個數據,指針減1。當指針值減為0時,表示LIFO充滿數據。
每讀出一個數據,指針加1。當指針值為最大值(即指向棧底)時,說明LIFO中沒有數據了。通常把LIFO(堆棧)的寫入操作叫壓入,讀出操作叫彈出。