資料結構是指相互之間存在著一種或多種關係的資料元素的集合和該集合中資料元素之間的關係組成資料結構的分類:簡單來說, 資料結構就是設計資料以何種方式組織度儲存在計算機中
比如:列表、集合和字典等都是一種資料結構
「程式=資料結構+演算法」
資料結構按照邏輯結構可分為線性結構、樹結構和圖結構另外,32位機器上,乙個整數佔4個位元組(4*8bit=32),乙個位址也佔4個位元組線性結構:資料結構中的元素存在一對一的相互關係
樹結構:資料結構中的元素存在一對多的相互關係
圖結構:資料結構中的元素存在多對多的相互關係
棧:棧(stack)是乙個資料集合,可以理解為只能在一端進行插入或刪除操作的列表
棧的特點:後進先出(last-in,first-out)棧的應用 -- 括號匹配問題:棧的概念:棧頂(表尾;最後乙個元素),棧底(表頭;0號元素)
棧的基本操作:
進棧(壓棧):push
出棧:pop
取棧頂(只檢視棧頂的值,但不把棧頂刪除): gettop
使用一般的列表結構即可實現棧
括號匹配問題:給乙個字串,其中包含小括號、中括號、大括號,求該字串中的括號是否匹配示例**:如: (){} #匹配
() #
匹配 ( #
不匹配 [(]) #
不匹配
class1. 鍊錶定義: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)
#示意圖:鍊錶是由一系列節點組成的元素集合。每個節點包含兩部分:資料域item 和 指向下乙個節點的指標next。通過節點之間的相互連線,最終串聯成乙個鍊錶
示例**:
class2. 鍊錶的建立和定義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
(a.next.item)
(a.next.next.item)
#列印結果:#2
#3
鍊錶的建立:鍊錶節點的插入和刪除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
()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,物理結構 是指資料的邏輯結構在計算機中的儲存形...