常用數據結構--線性結構

數據結構是計算機存儲、組織數據的方式。常見的數據結構分類方式如下圖:

常用的線性結構有:線性表,棧,隊列,循環隊列,數組。線性表中包括順序表、鏈表等,其中,棧和隊列只是屬于邏輯上的概念,實際中不存在,僅僅是一種思想,一種理念;線性表則是在內存中數據的一種組織、存儲的方式。

? 順序表

順序表將元素一個接一個的存入一組連續的存儲單元中,在內存物理上是連續的。如下圖:

順序表存儲密度較大,節省空間;但需要事先確定容量,在時間性能方面,讀運算較快,時間復雜度為O(1);查找運算為O(n/2),和鏈表同樣;插入運算和刪除運算如果要操作中間一個元素,比如3,那么就需要把3后面的元素全部進行移動,因此時間復雜度相對鏈表要大一些,插入時間復雜度最好為O(0)或最壞為O(n);刪除時間復雜度為O([n-1]/2);

? 鏈表

鏈表擁有很多結點,每個結點前半部分是數據域,后半部分是指針域,指針域指針指向下一個結點;鏈表可分為單鏈表、循環鏈表和雙鏈表。

單鏈表:


從上圖可以看出,單鏈表的上一個結點指針指向下一個結點,最后一個結點的指針域為null。

結點的刪除


刪除一個結點,如刪除上圖中q結點,只需將p結點中的指針域指向a3,然后將a2釋放掉(free)即可。

結點的插入:


插入一個結點,如插入上圖中s結點,首先將s的指針域指向a2(也就是把s的next賦值為p的next),然后將p結點的指針域指向x即可(p的next指向x)。

循環鏈表


循環鏈表與單鏈表唯一不同之處是,循環鏈表的最后一個結點指針不為空,而是指向頭結點。結點的插入和刪除和單鏈表非常相似,就不再示范了。

雙鏈表


雙鏈表擁有一前一后兩個指針域,從兩個不同的方向把鏈表連接起來,如此一來,從兩個不同的方向形成了兩條鏈,因此成為雙鏈表。因此,雙鏈表的靈活度要大于單鏈表。

結點的刪除:


雙鏈表的操作比單鏈表要稍顯復雜(按照單鏈表思路來做其實也不難),如上圖,要刪除p節點,首先需要將a1的后驅指向a3,然后將a3的前驅指向a1,最后將p節點釋放掉即可。

結點的插入:

如上圖,插入q結點,首先要按照方向,將步驟拆分,首先將q節點的前驅指向p結點后驅,緊接著將x后驅指向a2;然后按照順序完成圖中所示的3、4步即可。(@llhhyy1989??@voteforvip?@wanghuan203?位童鞋的指正,發現此處有誤,正確插入方法可查看評論,為保留錯誤原文不做改動!不懂具體插入過程可移步:百度知道

從空間性能來看,鏈表的存儲密度要差一些,但在容量分配上更靈活一些。從時間性能來看,查找運算與順序存儲相同,插入運算和刪除運算的時間復雜度為O(1),要更優于順序存儲,但讀運算則弱一些,為O([n+1]/2),最好為1,最壞為n。

??棧

上面提到棧屬于一個邏輯概念,棧的實現可以用順序也可以用鏈式。它遵循先進后出原則,如下圖:

Java中測試代碼如下:

[java] view plaincopy
  1. package?com.snail.test;??
  2. ??
  3. import?java.util.Stack;??
  4. ??
  5. public?class?TestStack?{??
  6. ??
  7. ????public?static?void?main(String[]?args)?{??
  8. ??????????
  9. ????????Stack<String>?stack?=?new?Stack<String>();??
  10. ????????stack.push("NO1");??
  11. ????????stack.push("NO2");??
  12. ????????stack.push("NO3");??
  13. ??????????
  14. ????????System.out.println("初始數量:"?+?stack.size());??
  15. ??
  16. ????????while(!stack.isEmpty()){??
  17. ????????????System.out.println(stack.pop());??
  18. ????????}?????
  19. ??????????
  20. ????????System.out.println("取完后的數量:"?+?stack.size());??
  21. ????}??
  22. }??

輸出結果順序為:初始數量:3,NO3,NO2,NO1,取完后的數量:0。

?? 隊列

隊列遵循先進先出的原則,如下圖:

Java中測試代碼如下:

[java] view plaincopy
  1. package?com.snail.test;??
  2. ??
  3. /**?
  4. ?*?
  5. ?*?@author?Zang?XT?
  6. ?*/??
  7. import?java.util.Queue;??
  8. import?java.util.LinkedList;??
  9. public?class?TestQueue?{??
  10. ????public?static?void?main(String[]?args)?{??
  11. ????????Queue<String>?queue?=?new?LinkedList<String>();??
  12. ??????????
  13. ????????queue.offer("NO1");??
  14. ????????queue.offer("NO2");??
  15. ????????queue.offer("NO3");??
  16. ??????????
  17. ????????System.out.println("初始數量"?+?queue.size());??
  18. ????????String?str;??
  19. ????????while((str=queue.poll())!=null){??
  20. ????????????System.out.println(str);??
  21. ????????}??
  22. ????????System.out.println("取出后數量"?+?queue.size());??
  23. ????}??
  24. }??

運行結果順序為:初始數量3,NO1,NO2,NO3,取出后數量0。

隊列還有一種形式為循環隊列,如下圖:


循環隊列有兩個指針,頭指針head和尾指針tail,尾指針一般指向的不是隊尾元素實際地址,而是指向實際地址的下一個空地址,因此,循環隊列一般犧牲最后一個空間,用來計算該隊列是否滿了,判斷方式是tail+1 = head,既該隊列已滿。

為了盡可能的說清楚,插了大量圖片,希望理解。以后有時間將繼續分析樹、圖等數據結構。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451414.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

依賴注入簡介(一)

依賴注入(Injecting dependencies)經常聽起來會讓人感覺到很難以理解&#xff0c;會讓大家感覺這是很復雜的編程技術&#xff0c;但是事實上并不是這樣&#xff0c;依賴注入非常方便使用&#xff0c;它會讓你的程序非常便于理解&#xff0c;同時也更容易進行測試。 依賴注入的…

Jmeter筆記(Ⅱ)使用Jmeter實現輕量級的接口自動化測試

接口測試雖然作為版本的一環&#xff0c;但是也是有一套完整的體系&#xff0c;有接口的功能測試、性能測試、安全測試&#xff1b;同時&#xff0c;由于接口的特性&#xff0c;接口的自動化低成本高收益的&#xff0c;使用一些開源工具或一些輕量級的方法&#xff0c;在測試用…

設置Android Studio工程布局文件的默認布局

每次創建新的工程后&#xff0c;布局文件的的布局總是ConstraintLayout&#xff0c;如何更改&#xff1f; 進入Android Studio安裝目錄&#xff0c;用文本編輯器打開文件plugins\android\lib\templates\activities\common\root\res\layout\simple.xml.ftl 將文件內容修改為 <…

依賴注入簡介(二)

在上一篇中&#xff0c;我們已經介紹過了最基本的依賴注入&#xff0c;接下來我們來看如何對需要使用的類進行裝配。通常應用程序的組件之間的關聯是通過wiring&#xff0c;在Spring中同樣有很多方式來裝配。但是一個最通常我們使用的方法是利用XML。接下來我們來展示一個簡單的…

eclipse啟動tomcat 訪問http://localhost:8080 報404錯誤

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 eclipse正常啟動tomcat&#xff0c;但是 訪問http://localhost:8080 卻報404錯誤 修改下配置 就好操作如下圖 打開eclipse的server視圖&a…

3秒搞定!~~ 一億數據獲取前100個最大值

3秒搞定&#xff01;~~ 一億數據獲取前100個最大值 整合網絡上的算法。 根據我的思路。計算一億個數字中最大的前100個值。 昨晚效率還是很低。 今天搞的算法。 只需要3秒鐘。 獲取前100個 前1000個 速度都非常快。 算法原理&#xff1a; 把一億個數字的前100個 首先放入數…

手把手JDK環境變量配置

分為下載&#xff0c;配置&#xff0c;驗證三個步驟解釋如何進行JDK環境變量配置。 步驟一&#xff1a; 首先查看配置成功后的效果&#xff1a; tip:點擊win——>運行&#xff08;或者使用winr,或者shift鼠標右鍵打開powershell&#xff09;——>輸入cmd回車——>控制…

網易NEI在面臨前后端分離問題,所提供的完整解決方案

內容來源&#xff1a;2018 年 1 月5 日&#xff0c;網易NEI產品負責人包勇明在“2018移動技術創新大會”進行《網易高效多端應用協作開發實踐》演講分享。IT 大咖說&#xff08;微信id&#xff1a;itdakashuo&#xff09;作為獨家視頻合作方&#xff0c;經主辦方和講者審閱授權…

如何使用js動態顯示或隱藏DIV

在web頁面中&#xff0c;經常需要使用select控件來顯示div的顯示與隱藏&#xff0c;實現這個方法主要用到了setAttribute方法&#xff0c;以下為示例代碼 [html] view plaincopy <html> <title>通過選擇項顯示不同的結果</title> <head> <scr…

myeclipse進入Myeclipse configuration center 如何關閉

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 找到這個圖標&#xff0c;放上去顯示return即可關閉&#xff0c;隱藏很深有木有

程序員保持身心健康的八種方式

程序員是一個辛苦的行業&#xff0c;長時間面對的只是需要解決的問題&#xff0c;更不要提開發期限和無理取鬧的客戶了&#xff0c;這樣的工作簡直無以承受。怎么辦呢我們&#xff1f;我們熱愛編程&#xff0c;樂于創建功能……我們喜歡那種將一堆代碼弄成像Facebook或者Digg那…

[No0000166]CPU的組成結構及其原理

中央處理器(Central Processing Unit, CPU)CPU的基本架構和工作原理其實百科上講得已經相當清楚了&#xff0c;不過我覺得有些事情呢還是給個例子出來比較方便學習。本文會先從內存地址&#xff0c;計算機的一般架構之類的基礎知識出發&#xff0c;然后逐步為讀者"拼裝&qu…

Java 時間總結

轉載請標明出處&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/80613024 本文出自【趙彥軍的博客】 時區 整個地球分為二十四時區&#xff0c;每個時區都有自己的本地時間。為了統一起見&#xff0c;使用一個統一的時間&#xff0c;稱為通用協調時(UTC, Univer…

js中的var是什么意思

聲明&#xff08;創建&#xff09; JavaScript 變量 在 JavaScript 中創建變量經常被稱為“聲明”變量。您可以通過 var 語句來聲明 JavaScript 變量&#xff1a;var x; var carname; 在以上聲明之后&#xff0c;變量并沒有值&#xff0c;不過您可以在聲明它們時向變量賦值&…

HTTP/2 協議入門

一、2015年&#xff0c; HTTP/2發布。 二、二進制協議 HTTP/2是一個二進制協議&#xff0c;頭信息和數據體都是二進制&#xff0c;并且統稱為“幀”&#xff08;frame&#xff09;,頭信息幀和數據幀。 二進制協議的一個好處是&#xff0c;可以定義額外的幀。HTTP/2定義了近1…

態度決定高度

“一個將什么都不放在眼里的人&#xff0c;他的未來一定是一片黑暗&#xff0c;因為他什么都看不到”。知識的獲得和能力的鍛煉是個一點一滴慢慢積累的過程&#xff0c;這個過程需要我們端正態度&#xff0c;俯身求教。好高騖遠一直都是很多人容易犯的錯誤&#xff0c;這樣導致…

中間件技術是什么?

&#xff08;一&#xff09;舉例說明&#xff1a; 我開了一家炸雞店&#xff08;業務端&#xff09;&#xff0c;然而周邊有太多屠雞場&#xff08;底層&#xff09;&#xff0c;為了成本我肯定想一個個比價&#xff0c;再綜合質量挑選一家屠雞場合作&#xff08;適配不同底層邏…

4.10/4.11/4.12 lvm講解 4.13 磁盤故障小案例

2019獨角獸企業重金招聘Python工程師標準>>> 準備磁盤分區 fdisk /dev/sdb n 創建三個新分區&#xff0c;分別1G t 改變分區類型為8e 準備物理卷 pvcreate /dev/sdb1 pvcreate /dev/sdb2 pvcreate /dev/sdb3 pvdisplay/pvs 列出當前的物理卷 pvremove /dev/sdb3 刪除…

《Effective Java》 第一講:創建和銷毀對象

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、用靜態工廠方法代替構造器 用靜態工廠的優點 &#xff1a; 1. 方法有名字&#xff0c;更好理解。 2.不必每次調用的時候都創建一…

外圍功能電路控制 LET′S TRY“嵌入式編程”: 4 of 6

外圍功能電路控制 LET′S TRY“嵌入式編程”: 4 of 6本連載講解作為嵌入式系統開發技術人員所必需具備的單片機的基礎知識。 在《單片機入門&#xff08;1&#xff09;&#xff5e;&#xff08;3&#xff09;》中&#xff0c;我們一起學習了單片機的硬件和編程語言以及開發環境…