数据结构代码(Python)
链表
链表的创建
class Node ( ) :
def __init__ ( self, value) :
self. value = value
self. next = None
node1 = Node( 1 )
node2 = Node( 2 )
node3 = Node( 3 )
node1. next = node2
node2. next = node3
print ( node1. value, node1. next . value, node1. next . next . value)
node3. next = node2
node2. next = node1
print ( node3. value, node3. next . value, node3. next . next . value)
class SingeNode :
def __init__ ( self, item) :
self. item = item
self. next = None
class LinkList :
def __init__ ( self) :
self. head = None
def is_empty ( self) :
""" 判断链表是否为空"""
return self. head is None
def __len__ ( self) :
"""计算链表的长度"""
cur = self. head
count = 0
while cur is not None :
count += 1
cur = cur. next
return count
def travel ( self) :
"""遍历链表"""
cur = self. head
while cur is not None :
print ( cur. item)
cur = cur. next
def creat_linklist_head ( self, li= None , item= None ) :
"""头插法"""
if li:
self. head = SingeNode( li[ 0 ] )
for element in li[ 1 : ] :
node = SingeNode( element)
node. next = self. head
self. head = node
elif item:
node = SingeNode( item)
node. next = self. head
self. head = node
return self. head
def creat_linklist_tail ( self, li= None , item= None ) :
"""尾插法"""
if li:
self. head = SingeNode( li[ 0 ] )
tail = self. head
for element in li[ 1 : ] :
node = SingeNode( element)
tail. next = node
tail = node
elif item:
tail = self. head
node = SingeNode( item)
tail. next = node
tail = node
return self. head
def insert ( self, pos, item) :
"""指定位置添加元素"""
if pos <= 0 :
self. creat_linklist_head( item= item)
elif pos > len ( self) - 1 :
self. creat_linklist_tail( item= item)
else :
node = SingeNode( item)
count = 0
pre = self. head
while count < ( pos - 1 ) :
count += 1
pre = pre. next
node. next = pre. next
pre. next = node
def search ( self, item) :
"""指定值进行查找"""
cur = self. head
while cur is not None :
if cur. item == item:
return True
cur = cur. next
return False
def remove ( self, item) :
"""删除指定值的结点"""
cur = self. head
pre = None
while cur is not None :
if cur. item == item:
if not pre:
self. head = cur. next
else :
pre. next = cur. next
break
else :
pre = cur
cur = cur. next
def creat_2_LinkList_head ( self, li= None , item= None ) :
"""头插法"""
def head ( value) :
node = SingeNode( value)
if self. is_empty( ) :
self. head = node
else :
node. next = self. head
self. head. prev = node
self. head = node
if li:
for elment in li:
head( elment)
elif item:
head( item)
def creat_2_LinkList_tail ( self, li= None , item= None ) :
"""尾部插入元素"""
def tail ( value) :
node = SingeNode( value)
if self. is_empty( ) :
self. head = node
else :
cur = self. head
while cur. next is not None :
cur = cur. next
cur. next = node
node. prev = cur
if li:
for element in li:
tail( element)
elif item:
tail( item)
if __name__ == '__main__' :
pass
双链表的创建与使用
from LinkList. link_list import *
class creat_double_LinkList :
def __init__ ( self) :
self. head = None
def is_empty ( self) :
""" 判断链表是否为空"""
return self. head is None
def add ( self, item) :
"""头部插入元素"""
node = SingeNode( item)
if self. is_empty( ) :
self. head = node
else :
node. next = self. head
self. head. prev = node
self. head = node
def travel ( self) :
"""遍历链表"""
cur = self. head
while cur is not None :
print ( cur. item)
cur = cur. next
if __name__ == '__main__' :
dlk = creat_double_LinkList( )
dlk. add( 1 )
dlk. add( 2 )
dlk. travel( )
栈
class Stack ( object ) :
"""栈"""
def __init__ ( self) :
self. items = [ ]
def is_empty ( self) :
"""判断是否为空"""
return self. items == [ ]
def push ( self, item) :
"""加入元素"""
self. items. append( item)
def pop ( self) :
"""弹出元素"""
return self. items. pop( )
def peek ( self) :
"""返回栈顶元素"""
return self. items[ len ( self. items) - 1 ]
def size ( self) :
"""返回栈的大小"""
return len ( self. items)
if __name__ == "__main__" :
stack = Stack( )
stack. push( 1 )
stack. push( 2 )
stack. push( 3 )
print ( stack. items)
print ( stack. size( ) )
print ( stack. peek( ) )
print ( stack. pop( ) )
print ( stack. pop( ) )
print ( stack. pop( ) )
队列
class Queue ( object ) :
"""队列"""
def __init__ ( self) :
self. items = [ ]
def is_empty ( self) :
return self. items == [ ]
def enqueue ( self, item) :
"""进队列"""
self. items. insert( 0 , item)
def dequeue ( self) :
"""出队列"""
return self. items. pop( )
def size ( self) :
"""返回大小"""
return len ( self. items)
if __name__ == "__main__" :
q = Queue( )
q. enqueue( 1 )
q. enqueue( 2 )
q. enqueue( 3 )
print ( q. items)
print ( q. size( ) )
print ( q. dequeue( ) )
print ( q. dequeue( ) )
print ( q. dequeue( ) )
树
class Node ( object ) :
"""节点类"""
def __init__ ( self, elem, lchild= None , rchild= None ) :
self. elem = elem
self. lchild = lchild
self. rchild = rchild
class Tree ( object ) :
"""树类"""
def __init__ ( self, root= None ) :
self. root = root
def add ( self, elem) :
"""为树添加节点"""
node = Node( elem)
if self. root is None :
self. root = node
else :
queue = [ self. root]
while queue:
cur = queue. pop( 0 )
if cur. lchild is None :
cur. lchild = node
return
elif cur. rchild is None :
cur. rchild = node
return
else :
queue. append( cur. lchild)
queue. append( cur. rchild)
def breadth_travel ( self) :
"""利用队列实现树的层次遍历"""
if self. root is None :
return
queue = [ self. root]
while queue:
node = queue. pop( 0 )
print ( node. elem)
if node. lchild is not None :
queue. append( node. lchild)
if node. rchild is not None :
queue. append( node. rchild)
def preoder ( self, root) :
"""先序遍历:根->左->右"""
if root is None :
return
print ( root. elem)
self. preoder( root. lchild)
self. preoder( root. rchild)
def inoder ( self, root) :
"""中序遍历:左->根->右"""
if root is None :
return
self. inoder( root. lchild)
print ( root. elem)
self. inoder( root. rchild)
def postoder ( self, root) :
"""后序遍历:左->右->根"""
if root is None :
return
self. preoder( root. lchild)
self. postoder( root. rchild)
print ( root. elem)
if __name__ == '__main__' :
tree = Tree( )
tree. add( 1 )
tree. add( 2 )
tree. add( 3 )
tree. add( 4 )
tree. add( 5 )
tree. add( 6 )
tree. add( 7 )
tree. add( 8 )
tree. add( 9 )
print ( '层次遍历:' )
tree. breadth_travel( )
print ( '先序遍历:' )
tree. preoder( tree. root)
print ( '中序遍历:' )
tree. inoder( tree. root)
print ( '后序遍历:' )
tree. postoder( tree. root)
查找算法
def recursive_binary_search ( li, item) :
""""递归法"""
if len ( li) == 0 :
return False
else :
midpoint = len ( li) // 2
if item == li[ midpoint] :
return True
else :
if item < li[ midpoint] :
return recursive_binary_search( li[ : midpoint] , item)
else :
return recursive_binary_search( li[ midpoint + 1 : ] , item)
def non_recursive_binary_search ( li, item) :
"""非递归"""
first = 0
last = len ( li) - 1
while first <= last:
midpoint = ( first + last) // 2
if item == li[ midpoint] :
return True
elif item < li[ midpoint] :
last = midpoint - 1
else :
first = midpoint + 1
return False
if __name__ == '__main__' :
li = [ 0 , 1 , 2 , 8 , 13 , 17 , 19 , 32 , 42 , ]
print ( "递归二分查找法:" )
print ( recursive_binary_search( li= li, item= 8 ) )
print ( recursive_binary_search( li= li, item= 3 ) )
print ( "=" * 20 )
print ( "非递归二分查找法:" )
print ( non_recursive_binary_search( li= li, item= 8 ) )
print ( non_recursive_binary_search( li= li, item= 3 ) )
排序算法
冒泡排序
def bubble_sort ( alist) :
for j in range ( len ( alist) - 1 , 0 , - 1 ) :
for i in range ( j) :
if alist[ i] > alist[ i+ 1 ] :
alist[ i] , alist[ i+ 1 ] = alist[ i+ 1 ] , alist[ i]
li = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ]
bubble_sort( li)
print ( li)
选择排序
def selcet_sort ( alist) :
for i in range ( len ( alist) - 1 ) :
min_num = alist[ i]
for j in range ( i + 1 , len ( alist) ) :
if alist[ j] < min_num:
min_num = alist[ j]
alist[ i] , alist[ j] = alist[ j] , alist[ i]
li = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ]
selcet_sort( li)
print ( li)
插入排序
alist = [ 54 , 226 , 93 , 17 , 77 , 44 , 4 , 55 , 21 ]
def insert_sort1 ( alist) :
for j in range ( 1 , len ( alist) ) :
max = alist[ j]
for i in range ( 0 , len ( alist) - 1 , 1 ) :
if alist[ i] > max :
max = alist[ i]
alist[ j] , alist[ i] = alist[ i] , alist[ j]
print ( alist)
insert_sort1( alist)
print ( alist)
def insert_sort2 ( alist) :
for i in range ( 1 , len ( alist) ) :
for j in range ( i, 0 , - 1 ) :
if alist[ j] < alist[ j- 1 ] :
alist[ j] , alist[ j- 1 ] = alist[ j- 1 ] , alist[ j]
alist = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ]
insert_sort2( alist)
print ( alist)
def insert_sort3 ( alist) :
for i in range ( 1 , len ( alist) ) :
while i > 0 :
if alist[ i] < alist[ i- 1 ] :
alist[ i] , alist[ i- 1 ] = alist[ i- 1 ] , alist[ i]
i -= 1
else :
break
alist = [ 54 , 26 , 93 , 1711 , 77 , 31 , 44 , 55 , 20 ]
insert_sort3( alist)
print ( alist)
希尔排序
def shell_sort ( alist) :
n = len ( alist)
gap = n// 2
while gap >= 1 :
for j in range ( gap, n) :
i = j
while i > 0 :
if alist[ i] < alist[ i- gap] :
alist[ i] , alist[ i- gap] = alist[ i- gap] , alist[ i]
i -= gap
else :
break
gap //= 2
alist = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ]
shell_sort( alist)
print ( alist)
快速排序
def quick_sort ( alist, start, end) :
"""快速排序"""
if start >= end:
return
mid = alist[ start]
low = start
high = end
while low < high:
while low < high and alist[ high] >= mid:
high -= 1
alist[ low] = alist[ high]
while low < high and alist[ low] < mid:
low += 1
alist[ high] = alist[ low]
alist[ low] = mid
quick_sort( alist, start, low- 1 )
quick_sort( alist, low+ 1 , end)
alist = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ]
quick_sort( alist, 0 , len ( alist) - 1 )
print ( alist)
归并排序
def merge_sort ( alist) :
if len ( alist) <= 1 :
return alist
num = len ( alist) / 2
left = merge_sort( alist[ : num] )
right = merge_sort( alist[ num: ] )
return merge( left, right)
def merge ( left, right) :
'''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组'''
l, r = 0 , 0
result = [ ]
while l< len ( left) and r< len ( right) :
if left[ l] < right[ r] :
result. append( left[ l] )
l += 1
else :
result. append( right[ r] )
r += 1
result += left[ l: ]
result += right[ r: ]
return result
alist = [ 54 , 26 , 93 , 17 , 77 , 31 , 44 , 55 , 20 ]
sorted_alist = mergeSort( alist)
print ( sorted_alist)