数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系的组成。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