-
什么是邏輯結構?
簡單說,邏輯結構就是數據之間的關系。而按數據之間的關系來說,邏輯結構大概可以分為兩種:線性結構和非線性結構(集合、樹、網)。
- 線性結構:有且只有一個開始結點和一個終端結點,並且所有結點都最多只有一個直接前驅和一個直接后繼。例如:線性表,典型的線性表有:順序表、鏈表、棧(順序棧、鏈棧)和隊列(順序隊列、鏈隊列)。它們共同的特點就是數據之間的線性關系,除了頭結點和尾結點之外,每個結點都有唯一的前驅和唯一的后繼,也就是所謂的一對一的關系。
- 非線性結構:對應於線性結構,非線性結構也就是每個結點可以有不止一個直接前驅和直接后繼。常見的非線性結構包括:樹(二叉樹)、圖(網)等。
-
什么是存儲結構?
邏輯結構指的是數據間的關系,而存儲結構是邏輯結構的存儲映像。通俗的講,可以將存儲結構理解為邏輯結構用計算機語言的實現。常見的存儲結構有順序存儲、鏈式存儲、索引存儲以及散列存儲(哈希表)。
-
順序存儲:把邏輯上相鄰的節點存儲在物理位置上相鄰的存儲單元中,結點之間的邏輯關系由存儲單元的鄰接關系來體現。由此得到的存儲結構為順序存儲結構,通常順序存儲結構是借助於數組來描述的。優點:節省空間,可以實現隨機存取;缺點:插入、刪除時需要移動元素,效率低。
-
鏈式存儲:在計算機中用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。特點是元素在物理上可以不相鄰,所以每個數據元素包括了一個數據域和一個指針域,數據域用來存放數據,而指針域用來指向其后繼結點的位置。優點:插入、刪除靈活;缺點:不能隨機存取,查找速度慢。
-
-
邏輯結構和存儲結構的區別和判斷
這兩者並不沖突,一個指的是數據之間的關系,而另一個指這種關系在計算機中的表現形式。比如,線性表中的棧,數據元素之間的關系是一對一的,除頭和尾結點之外的每個結點都有唯一的前驅和唯一的后繼,這體現的是邏輯結構;而對於棧中的結點來說,它們可以順序存儲(也就是順序棧),取一段連續的存儲空間,將棧結點按順序存入,每個結點和其前驅和后繼在物理上都是相鄰的。同時,棧結點也可以鏈式存儲(鏈棧),每個結點中包括數據域和指針域,而指針域就是用來指向其后繼的,在訪問時就可以通過指針來找到其后繼進行訪問,每個結點之間物理上可以相鄰也可以不相鄰。
下圖即是數據結構的划分圖(具體枚舉不再細列)。
判斷:當一個結構,如數組、鏈表、樹、圖,在邏輯結構中只有一種定義,而在物理結構中卻有兩種選擇,那么這個結構就屬於邏輯結構;
相反,當此結構在原有基礎上加上了某種限定,使得其在物理結構中只有一種定義,那么這個結構就屬於物理(存儲)結構;
舉例1:棧屬於什么結構?
分析:棧在邏輯結構中只能屬於線性結構,而在物理結構中它可以使用順序存儲(數組),也可以使用鏈式存儲(鏈表),所以說棧是一種邏輯結構。
舉例2:線索二叉樹屬於什么結構?
分析:首先,可以得到二叉樹是一種數據結構,但是線索二叉樹是加上線索后的鏈表結構(不能用順序存儲),也就是說,它是計算機內部的只有一種存儲結構,所以是物理結構。
(有人肯定問,圖是邏輯結構,圖難道能用順序存儲嗎?答案是肯定的,只是我們一般不這么用,詳情見此博客:圖的存儲結構(數組表示法)及C語言實現)
以上,歡迎討論。