日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

常用数据结构--线性结构

發(fā)布時(shí)間:2023/12/18 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常用数据结构--线性结构 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)分類(lèi)方式如下圖:

常用的線性結(jié)構(gòu)有:線性表,棧,隊(duì)列,循環(huán)隊(duì)列,數(shù)組。線性表中包括順序表、鏈表等,其中,棧和隊(duì)列只是屬于邏輯上的概念,實(shí)際中不存在,僅僅是一種思想,一種理念;線性表則是在內(nèi)存中數(shù)據(jù)的一種組織、存儲(chǔ)的方式。

? 順序表

順序表將元素一個(gè)接一個(gè)的存入一組連續(xù)的存儲(chǔ)單元中,在內(nèi)存物理上是連續(xù)的。如下圖:

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

? 鏈表

鏈表?yè)碛泻芏?span style="font-family:arial; font-size:17px; line-height:32px; text-indent:37px">結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)前半部分是數(shù)據(jù)域,后半部分是指針域,指針域指針指向下一個(gè)結(jié)點(diǎn);鏈表可分為單鏈表、循環(huán)鏈表和雙鏈表。

單鏈表:


從上圖可以看出,單鏈表的上一個(gè)結(jié)點(diǎn)指針指向下一個(gè)結(jié)點(diǎn),最后一個(gè)結(jié)點(diǎn)的指針域?yàn)閚ull。

結(jié)點(diǎn)的刪除


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

結(jié)點(diǎn)的插入:


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

循環(huán)鏈表


循環(huán)鏈表與單鏈表唯一不同之處是,循環(huán)鏈表的最后一個(gè)結(jié)點(diǎn)指針不為空,而是指向頭結(jié)點(diǎn)。結(jié)點(diǎn)的插入和刪除和單鏈表非常相似,就不再示范了。

雙鏈表


雙鏈表?yè)碛幸磺耙缓髢蓚€(gè)指針域,從兩個(gè)不同的方向把鏈表連接起來(lái),如此一來(lái),從兩個(gè)不同的方向形成了兩條鏈,因此成為雙鏈表。因此,雙鏈表的靈活度要大于單鏈表。

結(jié)點(diǎn)的刪除:


雙鏈表的操作比單鏈表要稍顯復(fù)雜(按照單鏈表思路來(lái)做其實(shí)也不難),如上圖,要?jiǎng)h除p節(jié)點(diǎn),首先需要將a1的后驅(qū)指向a3,然后將a3的前驅(qū)指向a1,最后將p節(jié)點(diǎn)釋放掉即可。

結(jié)點(diǎn)的插入:

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

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

??棧

上面提到棧屬于一個(gè)邏輯概念,棧的實(shí)現(xiàn)可以用順序也可以用鏈?zhǔn)?。它遵循先進(jìn)后出原則,如下圖:

Java中測(cè)試代碼如下:

[java] view plaincopy
  • package?com.snail.test;??
  • ??
  • import?java.util.Stack;??
  • ??
  • public?class?TestStack?{??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ??????????
  • ????????Stack<String>?stack?=?new?Stack<String>();??
  • ????????stack.push("NO1");??
  • ????????stack.push("NO2");??
  • ????????stack.push("NO3");??
  • ??????????
  • ????????System.out.println("初始數(shù)量:"?+?stack.size());??
  • ??
  • ????????while(!stack.isEmpty()){??
  • ????????????System.out.println(stack.pop());??
  • ????????}?????
  • ??????????
  • ????????System.out.println("取完后的數(shù)量:"?+?stack.size());??
  • ????}??
  • }??
  • 輸出結(jié)果順序?yàn)?#xff1a;初始數(shù)量:3,NO3,NO2,NO1,取完后的數(shù)量:0。

    ?? 隊(duì)列

    隊(duì)列遵循先進(jìn)先出的原則,如下圖:

    Java中測(cè)試代碼如下:

    [java] view plaincopy
  • package?com.snail.test;??
  • ??
  • /**?
  • ?*?
  • ?*?@author?Zang?XT?
  • ?*/??
  • import?java.util.Queue;??
  • import?java.util.LinkedList;??
  • public?class?TestQueue?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Queue<String>?queue?=?new?LinkedList<String>();??
  • ??????????
  • ????????queue.offer("NO1");??
  • ????????queue.offer("NO2");??
  • ????????queue.offer("NO3");??
  • ??????????
  • ????????System.out.println("初始數(shù)量"?+?queue.size());??
  • ????????String?str;??
  • ????????while((str=queue.poll())!=null){??
  • ????????????System.out.println(str);??
  • ????????}??
  • ????????System.out.println("取出后數(shù)量"?+?queue.size());??
  • ????}??
  • }??
  • 運(yùn)行結(jié)果順序?yàn)?#xff1a;初始數(shù)量3,NO1,NO2,NO3,取出后數(shù)量0。

    隊(duì)列還有一種形式為循環(huán)隊(duì)列,如下圖:


    循環(huán)隊(duì)列有兩個(gè)指針,頭指針head和尾指針tail,尾指針一般指向的不是隊(duì)尾元素實(shí)際地址,而是指向?qū)嶋H地址的下一個(gè)空地址,因此,循環(huán)隊(duì)列一般犧牲最后一個(gè)空間,用來(lái)計(jì)算該隊(duì)列是否滿了,判斷方式是tail+1 = head,既該隊(duì)列已滿。

    為了盡可能的說(shuō)清楚,插了大量圖片,希望理解。以后有時(shí)間將繼續(xù)分析樹(shù)、圖等數(shù)據(jù)結(jié)構(gòu)。


    總結(jié)

    以上是生活随笔為你收集整理的常用数据结构--线性结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。