Swift資料結構引言

2021-12-30 01:58:23 字數 3275 閱讀 2954

了解不同資料結構的優劣,對我們今後的程式設計工作將十分有幫助(至於有什麼幫助,可以自行百度,也可以翻書)。作為這個系列的第一篇部落格,我們將重新複習一下swift中幾種內建的基本資料結構。

通常情況下,從元素之間的關係上來講,我們習慣上將資料結構分為兩種基本型別:順序儲存資料結構和連式儲存資料結構。順序儲存資料結構的特點是,邏輯關係上相鄰的兩個元素,它們在物理位置上也相鄰,也就是說資料是儲存在連續或者臨近的記憶體中的,比如說陣列、堆、矩陣和雜湊表;而鏈式儲存資料結構,其儲存單元可以相鄰,也可以不相鄰。鏈式儲存資料結構的元素,除了儲存元素本身的資料資訊之外,還會儲存下乙個(或者上乙個)元素的資訊。典型的鏈式儲存結構有鍊錶、樹和圖。你可以將這兩種型別的資料結構綜合起來使用,以便建立更加高效的資料結構。

我們首先要學習的是順序儲存資料結構。這種資料結構是典型的線性資料結構,通常都是基於索引,並且資料元素的訪問是按照一定的順序執行的。

1、陣列

陣列是最常見的資料結構,幾乎在各種程式語言中都存在。線性陣列,又稱一維陣列,是最簡單的陣列形式。在swift中,陣列是索引從0開始、按照順序儲存、可以隨機訪問的collection(集合)型別。除了一維陣列之外,陣列也可以以多維陣列的形式存在,比如說矩陣就是典型的多維陣列。

(1)、陣列的宣告

在swift中,宣告乙個陣列主要有三種方式,即:①、完整的陣列宣告方式,比如說使用泛型語法array;②、使用快速簡潔的方法,比如說[type];③、最後一種方式是使用型別推斷,也就是陣列的字面量語法。通常情況下,我們使用得最多的是第二種方法。這三種宣告陣列方法的例項如下:

// 使用完整的泛型語法宣告乙個陣列

let fullsyntaxform: array = ["關羽", "張飛", "趙雲", "馬超", "黃忠"]

// 使用快速語法宣告乙個陣列

let shorthandsyntaxform: [string] = ["關羽", "張飛", "趙雲", "馬超", "黃忠"]

// 使用陣列的字面量語法宣告乙個陣列(不用特別指明陣列的型別,變數的型別編譯器會自動根據賦值推斷)

let typeinferancesyntaxform = ["關羽", "張飛", "趙雲", "馬超", "黃忠"] // 編譯器自動推斷其為字串陣列

需要注意的是,使用型別推斷功能的前提是,在宣告陣列的過程中明確的給它賦乙個初始化值。另外,如果你在宣告陣列的過程中,不想給它賦值,而只想宣告乙個空的陣列,可以使用以下語法:

// 利用完整的泛型語法宣告乙個空的陣列

var fullsyntaxfor: array = array()

// 沒有明確指明陣列型別,但是在初始化的時候指明它是string型別

var shorthandsyntaxform = [string]()

// 在宣告的時候明確指明了陣列的型別是string型別,初始化的時候可以宣告型別和括號

var shorthandsyntaxform2: [string] =

(2)、訪問陣列中的元素

訪問陣列中元素的方式有很多,最簡單的是使用陣列下標;如果你想取出陣列中的某一段資料,還可以用範圍來取出它裡面的子串行;甚至,如果你想取出陣列中所有的元素,也可以使用for…in或者foreach。有一點需要注意,在使用陣列的下標時,千萬不要越界,否則會引發編譯錯誤:

var fivetigergeneral = ["關羽", "張飛", "趙雲", "馬超", "黃忠"]

// 通過下標來訪問陣列中的元素

let item = fivetigergeneral[2] // 取出陣列中下標為2的資料

// 取出陣列中某一段子串行

let items = fivetigergeneral[1...3] // 一次取出張飛、趙雲和馬超

// 使用for...in迴圈遍歷整個陣列

for item in fivetigergeneral

// 使用foreach遍歷整個陣列

fivetigergeneral.foreach

(3)、往陣列中新增元素

跟訪問陣列中的元素一樣,往陣列中新增元素的方式也有很多種,具體使用哪種方式,取決於你想把新元素新增到陣列的什麼位置。如果你只想把新元素新增到陣列的末尾,直接使用append()方法即可;如果你想把新元素新增到陣列指定的位置,應該使用insert(, at: )方法:

// 在陣列末尾新增元素

fivetigergeneral.append("劉備") // 將新元素劉備新增到陣列末尾

// 將新元素新增到陣列指定的位置

fivetigergeneral.insert("諸葛亮", at 1) // 在陣列索引為1的位置新增新元素諸葛亮

(4)、從陣列中刪除元素

同樣,從陣列中刪除乙個元素的姿勢也有好幾種,這同樣取決於你希望刪除陣列中哪個位置的元素。比如說,如果你想刪除陣列中第乙個元素,可以使用removefirst()方法;如果你想刪除陣列末尾的元素,可以使用removelast()方法;如果你想刪除陣列中指定位置的元素,可以使用remove(at: )方法;如果你想把陣列情況,可以使用removeall()方法:

// 刪除素組最後乙個元素

fivetigergeneral.removelast()

// 刪除陣列第乙個元素

fivetigergeneral.removefirst()

// 刪除陣列索引位置為1的元素

fivetigergeneral.remove(at: 1)

// 清空整個陣列

fivetigergeneral.removeall()

陣列的用途非常廣泛,除了日常的基本儲存之外,還可以用來實現其它複雜的資料結構,比如說棧、佇列、堆,以及雜湊表等等。

在鏈式儲存結構中,每個資料元素不僅僅要儲存資料資訊,還需要儲存與上乙個或者下乙個元素之間的關係。通常情況下,我們稱鏈式儲存結構中的元素為結點。結點一般包含兩部分資訊,其中儲存資料元素資訊的部分被稱之為資料域,儲存直接後繼或者前驅的部分為指標域,指標域中儲存的資訊被稱之為指標或者鏈。

鍊錶又分為單鏈表和雙鏈表,其中單鏈表的指標域儲存的是下乙個結點的資訊,而雙鏈表的指標域不僅儲存有下乙個結點的資訊,還有上乙個結點的資訊。單鏈表和雙鏈表結點的示意圖如下圖所示:

上圖中的結點s和n均為單鏈表結點,其中結點n為單鏈表中的尾結點,由於它不指示任何結點,因此指標域為空。而結點d為雙鏈表中的結點,其指標域不光指示下乙個結點的資訊,還指示上乙個結點的資訊。單鏈表結構在swift中的表示如下:

class linkedlist 這個只是單鏈表結點的簡單描述,完整的實現將會在後面的系列部落格中展現。

資料結構和演算法 引言

資料結構是幹什麼的?為什麼它總是跟演算法扯上關係?概括的說,要用計算機求解實際問題需要做兩件事 第一,把實際問題用計算語言描述 第二,用計算機語言求解這個問題 第一件事情是資料結構幹的,第二件事情就是演算法幹的。有乙個著名的公式 程式 資料結構 演算法 非常形象的描述了它們之間的關係。通常,我們都是...

資料結構 資料結構緒論

資料結構是相互間存在一種或多種特定關係的資料元素的集合。程式設計 資料結構 演算法 資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及他們之間的關係和操作等相關問題的學科。資料元素是組成資料的 有一定意義的基本單位,是計算機中通常作為整體處理,也被稱為記錄。乙個資料元素可以由若干個資料項組...

資料結構 資料結構演算法

分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...