數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係的組成。python
數據結構就是設計數據以何種方式存儲在計算機中,列表、字典等都算是數據結構。linux
程序=數據結構+算法,數據結構屬於靜態的部分,算法的調用爲動態部分算法
根據邏輯結構劃分:編程
python中的列表和其餘語言中的數組很類似,區別爲:數組
append操做會不會使速度變慢?安全
老是能聽到一個詞 堆棧 ,堆(heap)和棧(stack)是兩個東西,傳統的編程語言中把內存分爲兩個地方,堆空間和棧空間,堆存儲的是一些動態生成的對象,與數據結構中的堆是不一樣的,棧空間由系統調用,存放函數的參數值,局部變量的值。
應該是早年間翻譯的問題,通常聽到堆棧指的就是棧。數據結構
def brace_match(s):
app
stack = []
編程語言
d ={'(':')','[':']','{':'}'}
函數
for ch in s:
if ch in {'(','[','{'}:
stack.append(ch)
elif len(stack):
print('多了%s' %ch)
return False
elif d[stack[-1]] == ch:
stack.pop()
else:
print('%s不匹配'%ch)
if len(stack)==0:
return True
else:
print("未匹配")
return False
隊列是一個數據集合,僅容許在列表的一端插入,另外一端刪除。
因爲數組定長,不能繼續添加數據,若是是列表,出隊的操做就會出現空位,因此想辦法讓數組變成一個圓環。
import queue #涉及線程安全用queue
from collections import deque #經常使用解題的用deque
q = deque() #是一種雙向隊列,popleft出隊
#模擬linux命令 head和tail,假如是tail 5
deque(open('a.text','r',encooding='utf8'),5)
#創建一個定長的隊列,當隊列滿了以後,就會刪除第一行,繼續添加
鏈表就是非順序表,與隊列和棧對應。
鏈表中每個元素都是一個對象,每一個對象稱爲一個節點,包含有數據域key和指向下一個節點的next,經過各個節點之間的相互鏈接,最終串聯成一個鏈表。
頭節點爲空也是爲了表示空鏈表,也叫作帶空節點的鏈表,頭節點也能夠記錄鏈表的長度
class Node(object):
def __init__(self,item):
self.item=item
self.next=None
#eg
a=Node(1)
b=Node(2)
c=Node(3)
a.next=b
b.next=c #鏈表的最後一個節點的next就爲None
class LinkList:
def __init___(self,li,method='tail'):
self.head = None
self.tail = None
if method == 'head':
self.create_linklist_head(li)
if method == 'tail'
self.create_linklist_tail(li)
else:
rais ValueError('unsupport')
#頭插法
def create_linklist_head(self,li):
self.head = Node(0)
for v in li:
n = Node(v)
n.next = l.next #當插入下一個元素時,應該與下一個節點鏈接後再跟頭節點鏈接
self.head.next = n
self.head.data += 1
#尾插法
def create_linlist_tail(self,li):
self.head = Node(0)
self.tail = self.head
for v in li:
p = Node(v)
self.tail.next = p
self.tail = p
self.head.data += 1
#鏈表的遍歷輸出
def traverse_linlist(self):
p = self.head.next
while p:
yield p.data
p = p.next
#p表示待插入節點,curNode表示當前節點
p.next = curNode.next #不能當前鏈接直接斷開
curNode,next = p
p = curNode.next
curNode.next = p.next
del p #不寫也同樣,引用計數,python的內存回收機制
雙鏈表中每一個節點有兩個指針:一個指向後面節點、一個指向前面節點。
節點定義:
class Node(object):
def __init__(self, item=None):
self.item = item
self.next =www.myzx1.com None
self.prior = None
p.next = curNode.next
curNode.www.ycjszpgs.com next.prior = p
p.prior =www.dfzx157.com curNode
curNode.next = p
p = curNode.next
curNode.next = p.next
p.next.prior = curNode
del p
鏈表與列表相比
哈希表就是直接尋址表的改進。當關鍵字的全域U比較小時,直接尋址是一種簡單有效的方法。
哈希表是一個經過哈希函數計算數據存儲位置的線性表的存儲結構,又叫作散列表。
h(k)= k mod m
h(k) = floor(m(KA mod 1)) 0<A<1
因爲哈希表的大小是有限的,而要存儲信息的數量是無限的,所以,對於任何哈希函數,都會出現兩個元素映射到同一個位置的狀況,這種狀況就叫作哈希衝突。
解決哈希衝突的方法:
開放尋址法:若是哈希函數返回的位置已經有值,則能夠向後探查新的位置來儲存這個值。
p+1,p+2....
。p+1**2,p-1**2,p+2**2
。dic = {'name':'cui'}
#能夠認爲是h('name')=1,則哈希表爲[None,'cui