Python程序设计之数据结构

1.堆
堆是一个二叉树,其中每个父亲节点的值都不大于其所有子节点的值。
使用数组或列表来实现堆时,对于所有的k(下标,从0开始)都满足heap[k]<=heap[2k+1]和heap[k]<=heap[2k+2],并且堆中最小的元素总是位于二叉树的根节点。 栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;

import heapq 	#引入堆模块
import random 	#引入random模块
data=random.shuffle(list(range(10)))	#列表初始化为打乱的数字
heap=[]		#建堆
for n in data:
	heapq.heappush(heap,n)		#堆初始化
heapq.heappush(heap,0.5)		#新数据入堆	
heapq.heappop(heap)			#弹出最小的元素,堆会自动重建
list=[1,2,3]	#初始化列表
heapq.heapify(list)			#将列表转换为堆
heapq.heapreplace(list,6)	#替换列表中的元素值,自动重建堆
heapq.nlargest(2,list)		#返回堆中最大的两个元素
heapq.nsmallest(1,list)		#返回堆中最小的元素

2.队列
队列的特点是先进先出(FIFO)和后进后出(LILO)。 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

import queue	#引入队列模块(Python3.x中使用queue,Python2.x使用Queue)
q=queue.Queue()
for i in range(3)
	q.put(i)	#元素入队
>>>q.queue
>>>dqueue([0,1,2])
q.get()			#队列元素出队
q1=queue.LifoQueue(5)	#后进先出队列(后进元素在队列get()操作时先出)
q2=queue.PriorityQueue(5)	#优先级队列(默认出队时按从小到大)

自定义队列结构:

class myQueue:
	def __init__(self, size=10):
		self._content=[]
		self._size=size
		self._current=0
		
	def Setsize(self,size):
		if size

将上述代码保存为myQueue.py文件,模块创建参看:
https://blog.csdn.net/qxyloveyy/article/details/104345359

import myQueue	#引入自定义模块
q=myQueue.myQueue()	#队列初始化
>>>q.isFull()
>>>False		#可以调用myQueue模块中的所有函数,不再赘述

3.栈
栈是一种先进后出(FILO)或后进先出(LIFO)的数据结构。 栈,又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
Python本身就可以实现栈的基本操作!

class myStack:
	def __init__(self,size=10):
		self._content=[]
		self._current=0
		self._size=size
	
	def empty(self):
		self._content=[]
		self._current=0	
	
	def isEmpty(self):
		 if not self._content:
  			 return Ture
		  else:
   			return False	
   			
  	def isFull(self):
 		 if self._current==self._size:
 			  return True
		  else:
  			 return False
  			 
	def setSize(self,size):	#如果缩小栈空间,则删除指定大小之后的元素
		if size

4.链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
可以使用Python列表来实现链表简易功能!

my_linkTable=[]
for i in range(3):
	my_linkTable.append(i)	#在尾部追加节点
my_linkTable.insert(1,4)	#在链表中插入元素
my_linkTable.remove(my_linkTable[2])	#删除节点

5.二叉树
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。具有n个结点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。
自定义二叉树结构

class BinaryTree:
	def __init__(self,value):
		self._left=None
		self._right=None
		self.data=value
	
	def insertLeftChild(self,value): 	#创建左子树
		if self._left:
			print('Left child tree already exists.')
		else:
			self._left=BinaryTree(value)
			return self._left
				
	def insertRightChild(right,value):	#创建右子树
		 if self._left:
   			print('Right child tree already exists.')
  		else:
  			self._right=BinaryTree(value)
   			return self._right
   
   	def show(self):
   		print(self._data)
   		
	def preOrder(self):			#前序遍历
		print(self._data)		#输出根节点的值
		if self._left:			#遍历左子树
			self._left.preOrder()
		if self._right:			#遍历右子树
			self._right.preOrder()	
			
	def postOrder(self):			#后续遍历
		 if self._left:		   	#遍历左子树
  			self._left.postOrder()
  		if self._right:   		#遍历右子树
  			self._right.postOrder() 
  		 print(self._data)	
  
		
	def inOrder(self):			#中序遍历
		if self._left:   #遍历左子树
   			self._left.inOrder()
   		 print(self._data)	
 		if self._right:   #遍历右子树
   			self._right.inOrder() 
  
  if __name__=='__main__':
  	print('Please use me as a model !')

6.有向图
一个有向图D是指一个有序三元组(V(D),A(D),ψD) ,其中ψD)为关联函数,它使A(D)中的每一个元素(称为有向边或弧)对应于V(D)中的一个有序元素(称为顶点或点)对.
自定义有向图结构!

def searchPath(graph,start,end):
	results=[]
	__generatePath(graph,[start],end,results)
	reults.sort(key=lambda x:len(x))	#按所有路径的长度排序
	return results

def __generatePath(graph,path,end,results):
	current=path[-1]
	if current==end:
		results.append(path)
	else:
		for i in graph[current]:
			if i not in path:
				__generatePath(graph,path+[n],end,results)

def showPath(results):
	print('The path from ',results[0][0], 'to' ,results[0][-1],' is: ')
	for path in results:
		print(path)

if __name__=='__main__':
	graph={'A':['B','C','D']
		     'B':['C']
		     'C':['D']
		     'D':['E']}
	r1=searchPath(graph,'A','D')
	showPath(r1)
>>>The path is from A to D is:
>>>['A','D']
>>>['A','B','C','D']		     							

其他参考文章:
Python开发环境搭建:
https://blog.csdn.net/qxyloveyy/article/details/104227923
Python序列参看文章:
https://blog.csdn.net/qxyloveyy/article/details/104391462

希望对您有所帮助!

你可能感兴趣的:(Python,program,design)