演算法(2) 資料結構

2022-05-09 22:35:05 字數 4324 閱讀 8572

資料結構是指相互之間存在著一種或多種關係的資料元素的集合和該集合中資料元素之間的關係組成

簡單來說, 資料結構就是設計資料以何種方式組織度儲存在計算機中

比如:列表、集合和字典等都是一種資料結構

「程式=資料結構+演算法」

資料結構的分類:

資料結構按照邏輯結構可分為線性結構、樹結構和圖結構

線性結構:資料結構中的元素存在一對一的相互關係

樹結構:資料結構中的元素存在一對多的相互關係

圖結構:資料結構中的元素存在多對多的相互關係

另外,32位機器上,乙個整數佔4個位元組(4*8bit=32),乙個位址也佔4個位元組

棧:棧(stack)是乙個資料集合,可以理解為只能在一端進行插入或刪除操作的列表

棧的特點:後進先出(last-in,first-out)

棧的概念:棧頂(表尾;最後乙個元素),棧底(表頭;0號元素)

棧的基本操作:

進棧(壓棧):push

出棧:pop

取棧頂(只檢視棧頂的值,但不把棧頂刪除): gettop

使用一般的列表結構即可實現棧

棧的應用 -- 括號匹配問題:

括號匹配問題:給乙個字串,其中包含小括號、中括號、大括號,求該字串中的括號是否匹配

如: (){} #匹配

() #

匹配 ( #

不匹配 [(]) #

不匹配

示例**:

class

bracketerror(baseexception):

def__init__

(self,msg):

super(bracketerror,self).

__init__

() self.msg =msg

def__str__

(self):

return

"" %self.msg

class

stack(object):

"""實現棧的類

"""def

__init__

(self):

self.stack =

defpush(self,ele):

defpop(self):

if len(self.stack) ==0:

return

none

return

self.stack.pop()

defget_top(self):

if len(self.stack) ==0:

return

none

return self.stack[-1]

defis_empty(self):

return len(self.stack) == 0 #

返回的是乙個bool值

#棧的應用:括號匹配問題

defbracket_match(s):

stack =stack()

match_dict =

":"

for char in

s:

if char in ["

(","

[","()"

bracket_match(s)

1. 鍊錶定義:

#

鍊錶是由一系列節點組成的元素集合。每個節點包含兩部分:資料域item 和 指向下乙個節點的指標next。通過節點之間的相互連線,最終串聯成乙個鍊錶

示意圖:

示例**:

class

node(object):

def__init__

(self,item):

self.item =item

self.next =none

a = node(1)

b = node(2)

c = node(3)

#把 a 和 b, c 連線起來

a.next =b

b.next =c

print

(a.next.item)

print

(a.next.next.item)

#列印結果:#2

#3

2. 鍊錶的建立和定義

鍊錶的建立:

1) 頭插法:插到頭節點前面

2) 尾插法:插到尾節點後面

#示例**:

class

node(object):

def__init__

(self,item):

self.item =item

self.next =none

def create_linkedlist_head(li): #

通過列表進行 頭插法 建立鍊錶

head = node(li[0]) #

利用列表的第乙個元素建立煉表頭(頭節點)

for ele in li[1:]:

node = node(ele) #

建立煉表頭的上乙個節點

#新建立的這個節點的 next 指向 頭節點,然後讓新建立的這個節點作為頭節點

node.next =head

head =node

return head #

返回頭節點

defprint_linkedlist(lk):

#鍊錶的遍歷

while lk: #

節點不為空

print(lk.item, end=","

) lk =lk.next

print

()lk1 = create_linkedlist_head([1,2,3])

print_linkedlist(lk1)

#print_linkedlist(lk1) 執行結果:

#3,2,1,

def create_linkedlist_tail(li): #

通過列表 尾插法 建立鍊錶

head =node(li[0])

tail = head #

此處必須通過這種賦值方式,才能讓 最初的tail 指向 head; 如果 tail = node(li[0]) ,此時 tail 和 head 是不同的 node 例項

for ele in li[1:]:

node =node(ele)

#建立新節點,上乙個tail的next指向這個新節點,然後讓這個新節點成為 tail 節點

tail.next =node

tail =node

return

head

lk2 = create_linkedlist_tail([1,2,3,6,8])

print_linkedlist(lk2)

#上面列印結果:

#1,2,3,6,8,

鍊錶節點的插入和刪除

插入:

**:

p.next =curnode.next

curnode.next =p

#上面兩步的順序不能反,即應該先把 4 和 2 鏈起來,兩把 1 和 4 鏈起來

刪除:

**:

curnode.next = curnode.next.next
雙鏈表

#

雙鏈表的每個節點有兩個指標:乙個指向後乙個節點,另乙個指向前乙個節點

class

node(object):

def__init__(self,item=none):

self.item =item

self.next =none

self.prior = none

示意圖:

雙鏈表的插入和刪除:

#

雙鏈表的插入

p.next =curnode.next

curnode.next.prior =p

p.prior =curnode

curnode.next =p

#雙鏈表的刪除

p =curnode.next

curnode.next =p.next

p.next.prior = curnode

資料結構與演算法 2 演算法

目錄 一.演算法的定義 二.演算法的特性 1.輸入輸出 2.有窮性 3.確定性 4.可行性 三.演算法設計的要求 1.正確性 2.可讀性 3.健壯性 4.時間效率高和儲存量低 四.演算法效率的度量方法 1.事後統計方法 2.事前估計分析方法 五.演算法時間複雜度.1.演算法時間複雜度定義 2.推導大...

資料結構與演算法(2)

程式設計 資料結構 演算法 資料元素 是組成資料的 有一定意義的基本單位,在計算機中通常作為整體處理。資料項 乙個資料元素可以由若干個資料項組成。資料項是資料不可分割的最小單位。資料物件 是性質相同的資料元素的集合,是資料的子集。資料結構 是相互之間存在一種或多種特定關係的資料元素的集合。邏輯結構 ...

資料結構與演算法(2)

鏈結參考 資料結構是相互之間存在一種或多種特定關係的資料元素的集合 那麼具體是什麼關係呢,或者說,這裡的結構又是指什麼呢?按照視點的不同,我們把資料結構分為邏輯結構和物理結構 1,邏輯結構 是指資料物件中資料元素之間的相互關係 邏輯結構分為以下四種 2,物理結構 是指資料的邏輯結構在計算機中的儲存形...