博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python实现常用的数据结构
阅读量:4677 次
发布时间:2019-06-09

本文共 3926 字,大约阅读时间需要 13 分钟。

Python中的数据结构

 

#巧用Python列表特性实现特定数据结构

#栈实现

stack = []
stack.push(x)
stack.pop()
stack[-1]

 

#队列实现

from collections import deque
queue = deque()
#单向队列
queue.append(x)
queue.popleft()
#双向队列
queue.append(x)
queue.popleft()
queue.appendleft(x)
queue.pop()

 

#环形队列

#初始
dqueue = []
rear = 0
front = 0
#添加一个数据
front = (front + 1 ) % MaxSize
#一个数据出队
rear = (rear + 1 ) % MaxSize
#空队条件
rear == front
#满队条件
(rear + 1 ) % MaxSize == front

 

#巧用Python类特性实现特定数据结构

#链表实现

class Node(object):
def __init__(self,item=None):
  self.item = item
  self.next = None

def main():

  head = Node(1)
  b = Node(2)
  head.next = b

head -> b -> None

#head为链表首部,有无数据都可以

#遍历链表
def traversal(head):
  currNode = head
  while currNode is not None:
    print(currNode.item)
    currNode = currNode.next
#链表的插入、删除
#插入
#p.next = currNode.next
#currNode.next = p
#删除
#currNode.next = p
#currNode.next = currNode.next.next
#del p

 

#双向链表

class Node(object):
def __init__(self,item=None):
  self.item = itme
  self.next = None
  self.prev = None
#插入
#p.next = currNode.next
#currNode.next.prev = p
#p.prev = currNode
#currNode.next = p
#删除
#p = currNode.next
#currNode.next = p.next
#p.next.prev = currNode
#del p

 

#链表和列表的效率分析

#按元素查找时间复杂度都为O(n)
#按下标查找链表时间复杂度为O(n),列表为O(1)
#在某元素后插入数据链表时间复杂度为O(1),列表的时间复杂度为O(n)
#删除某元素链表时间复杂度为O(n),列表时间复杂度为O(1)

 

#散列表(Hash表)实现
#它是一种线性存储的表结构
#首先根据关键字k,进过某Hash函数,获得一个索引值
#然后将该关键字存储到索引值所在的位置

#这也是集合的存储原理

#对于字典也是类似的

#字典是对每一个key求索引值,索引值对应的位置存放相应的value

#问题一:

#索引值重复
#解决一:线性表每个位置采用链表存储,相同索引值得关键字,依次链接起来(拉链法
#解决二:通过哈希冲突函数得到新的地址(开放地址法)

 

#利用栈解决迷宫问题

maze = [    [1,1,1,1,1,1,1,1,1,1],    [1,0,0,1,0,0,0,1,0,1],    [1,0,0,1,0,0,0,1,0,1],    [1,0,0,0,0,1,1,0,0,1],    [1,0,1,1,1,0,0,0,0,1],    [1,0,0,0,1,0,0,0,0,1],    [1,0,1,0,0,0,1,0,0,1],    [1,0,1,1,1,0,1,1,0,1],    [1,1,0,0,0,0,0,1,0,1],    [1,1,1,1,1,1,1,1,1,1]]dirs = [lambda x, y: (x + 1, y),        lambda x, y: (x - 1, y),        lambda x, y: (x, y - 1),        lambda x, y: (x, y + 1)]def mpath(x1, y1, x2, y2):    stack = []    stack.append((x1, y1))    while len(stack) > 0:        curNode = stack[-1]        if curNode[0] == x2 and curNode[1] == y2:            #到达终点            for p in stack:                print(p)            return True        for dir in dirs:            nextNode = dir(curNode[0], curNode[1])            if maze[nextNode[0]][nextNode[1]] == 0:                #找到了下一个                stack.append(nextNode)                maze[nextNode[0]][nextNode[1]] = -1  # 标记为已经走过,防止死循环                break        else:#四个方向都没找到            maze[curNode[0]][curNode[1]] = -1  # 死路一条,下次别走了            stack.pop() #回溯    print("没有路")    return Falsempath(1,1,8,8)
View Code

#利用队列解决迷宫问题

from collections import  dequemg = [    [1,1,1,1,1,1,1,1,1,1],    [1,0,0,1,0,0,0,1,0,1],    [1,0,0,1,0,0,0,1,0,1],    [1,0,0,0,0,1,1,0,0,1],    [1,0,1,1,1,0,0,0,0,1],    [1,0,0,0,1,0,0,0,0,1],    [1,0,1,0,0,0,1,0,0,1],    [1,0,1,1,1,0,1,1,0,1],    [1,1,0,0,0,0,0,1,0,1],    [1,1,1,1,1,1,1,1,1,1]]dirs = [lambda x, y: (x + 1, y),        lambda x, y: (x - 1, y),        lambda x, y: (x, y - 1),        lambda x, y: (x, y + 1)]def print_p(path):    curNode = path[-1]    realpath = []    print('迷宫路径为:')    while curNode[2] != -1:        realpath.append(curNode[0:2])        curNode = path[curNode[2]]    realpath.append(curNode[0:2])    realpath.reverse()    print(realpath)def mgpath(x1, y1, x2, y2):    queue = deque()    path = []    queue.append((x1, y1, -1))    while len(queue) > 0:        curNode = queue.popleft()        path.append(curNode)        if curNode[0] == x2 and curNode[1] == y2:            #到达终点            print_p(path)            return True        for dir in dirs:            nextNode = dir(curNode[0], curNode[1])            if mg[nextNode[0]][nextNode[1]] == 0:  # 找到下一个方块                queue.append((*nextNode, len(path) - 1))                mg[nextNode[0]][nextNode[1]] = -1  # 标记为已经走过    return Falsemgpath(1,1,8,8)
View Code

转载于:https://www.cnblogs.com/cq146637/p/8064922.html

你可能感兴趣的文章
Mysql-2-数据库基础
查看>>
python把源代码打包成.exe文件
查看>>
PhotoshopCS5中将单位修改成百分比
查看>>
赵雅智:js知识点汇总
查看>>
cocos2d-x 3.0rc1 编译cpp-testsproject
查看>>
《Java虚拟机原理图解》1.3、class文件里的訪问标志、类索引、父类索引、接口索引集合...
查看>>
三种常见的图像处理双三次插值算法
查看>>
开玩笑html5(五岁以下儿童)---绕地球月球,地球绕太阳运动(canvas实现,同样可以移动哦)...
查看>>
安卓启动相关以及架构设计相关
查看>>
第十四届华中科技大学程序设计竞赛--J Various Tree
查看>>
python面试题No2
查看>>
插入排序
查看>>
.Net Core + NGINX跳转登录时端口丢失
查看>>
C#实现对文件目录的实时监控
查看>>
Python3 序列解包
查看>>
「Linux」VMware安装centos7(一)
查看>>
Java中模拟POST上传文件
查看>>
Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
查看>>
时隔2月,我的第二篇
查看>>
[导入]C++ OpenGL底层和C# GUI无缝联合!
查看>>