1、什麼是數據結構?html
數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成。 簡單來講,數據結構就是設計數據以何種方式組織並存儲在計算機中。 好比:列表、集合與字典等都是一種數據結構。 「程序=數據結構+算法」
2、數據結構的分類算法
數據結構按照其邏輯結構可分爲線性結構、樹結構、圖結構數組
下面就來講說線性結構,樹結構見連接,圖結構待續。。數據結構
3、線性結構app
(1)棧函數
一、定義:棧是一個數據集合,能夠理解爲只能在一端進行插入或者刪除操做的列表。spa
二、棧的特色:後進先出(last-in,first-out),簡稱LTFO表設計
三、棧的概念:3d
四、棧的基本操做:指針
如圖:
五、棧的Python實現
不須要本身定義,使用列表結構便可。
li = [] li.append(1) li.append(2) li.append(3) print(li) print(li.pop()) print(li.pop()) print(li.pop()) # print(li.pop()) #當棧空的時候就會報錯 # print(li[-1]) #查看棧頂元素
六、棧的應用----括號匹配問題
問題:給一個字符串,其中包含小括號,中括號,大括號,求該字符串中的括號是否匹配
例如:
()()[]{} 匹配 ([{()}]) 匹配 []( 不匹配 [(]) 不匹配
代碼以下:
# 方式一 def brace_match(s): '''括號匹配問題''' stack = [] # {()}[] match = {')': '(', '}': '{', ']': '['} match2 = {'(': ')', "{": "}", "[": "]"} for ch in s: # print(i) if ch in {'(', '{', '['}: # 若是左括號在裏面就把左括號添加進去,等待和右括號匹配 stack.append(ch) elif len(stack) == 0: # 若是再次進來括號的時候,這時候發現棧空了,說明缺乏了左括號了 print('缺乏了%s' % match[ch]) return False elif stack[-1] == match[ch]: # 好比棧頂元素是(,ch=')' stack.pop() else: print('括號不匹配') return False if len(stack) > 0: # 若是棧剩餘了,說明缺乏了右括號 print('缺乏了%s' % match2[stack[-1]]) return False return '匹配成功' # 方式二 def check_kuohao(s): stack = [] for char in s: if char in {'(', '[', '{'}: stack.append(char) elif char == ')': if len(stack) > 0 and stack[-1] == '(': stack.pop() else: return False elif char == ']': if len(stack) > 0 and stack[-1] == '[': stack.pop() else: return False elif char == '}': if len(stack) > 0 and stack[-1] == '{': stack.pop() else: return False if len(stack) == 0: return True else: return False ret = brace_match('{()}]') print(ret) print(check_kuohao('{()}]'))
(2)隊列
一、介紹
雙向隊列:對列的兩端都容許進行進隊和出隊操做
二、隊列的實現
隊列可否簡單用列表實現?爲何?
三、隊列的實現原理-----環形對列
環形隊列:當隊尾指針front == Maxsize + 1時,再前進一個位置就自動到0。
三、對列的內置模塊
使用方法:from collections import deque #deque是支持雙向隊列的
from collections import deque queue = deque()#建立隊列 queue.append('first') queue.append('second') queue.append('third') print(queue.popleft()) print(queue.popleft()) print(queue.popleft())#出隊,,先進先出 print([i for i in queue]) #查看隊列裏的元素 queue.appendleft('one')#雙向隊列隊首進隊 queue.appendleft('two')#雙向隊列隊首進隊 queue.appendleft('five')#雙向隊列隊首進隊 print(queue.pop()) print(queue.pop())#雙向隊列從隊尾出隊 print([i for i in queue]) #單向隊列 from queue import Queue q = Queue() q.put('a') q.put('b') q.put('c') print(q.get()) #a
(3)單鏈表
鏈表中每個元素都是一個對象,每個對象都是一個節點,包含有數據域key和指向下一個節點的指針next。經過各個節點之間的互相鏈接,最終串聯成一個列表
一、節點定義:
class Node(object): def __init__(self, item): self.item = item self.next = None
二、創建鏈表
頭插法
尾插法
三、鏈表的遍歷
四、鏈表節點的插入和刪除
# 插入: p.next = curNode.next curNode.next = p #刪除: p = curNode.next curNode.next = p.next #當前節點的下一個指向就指向他下一個的下一個 del p
插入:
刪除:
< >(4)雙鏈表
雙鏈表中的每一個節點有兩個指針:一個指向後面節點、一個指向前面節點
一、節點定義:
class Node(object): def __init__(self,item): 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 del p
(1)
(2)
(3)
(4)
這四張圖片分別對應上面的四行代碼
(5)哈希表
哈希表(又稱爲散列表),是一種線性表的存儲結構。哈希表由一個順序表(數組)和一個哈希函數組成。哈希函數h(k)將k做爲自變量,返回元素的存儲下標。
一、簡單哈希函數
假設有一個長度爲7的數組,哈希函數h(k)=k%7。元素集合{14,22,3,5}的存儲方式以下圖。
二、哈希衝突
因爲哈希表的大小是有限的,而要存儲的值的總數量是無限的,所以對於任何哈希函數,都會出現兩個不一樣元素映射到同一個位置上的狀況 ,
這種狀況叫作哈希衝突。
好比h(k)=k%7, h(0)=h(7)=h(14)=...
三、解決哈希衝突的辦法
開放尋址法:若是哈希函數返回的位置已經有值,則能夠向後探查新的位置來存儲這個值。
拉鍊法:哈希表每一個位置都鏈接一個鏈表,當衝突發生時,衝突的元素將被加到該位置鏈表的最後。
四、哈希表在Python中的應用
假設h(‘name’) = 3, h(‘age’) = 1, h(‘gender’) = 4,則哈希表存儲爲[None, 18, None, ’Alex’, ‘Man’]
參考or轉發
https://www.cnblogs.com/haiyan123/p/8407450.html