1、什么是数据结构

2、栈:后进先出

1、什么是栈

栈(Stack)是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。

      

2、栈的Python实现

stack = []
stack.append(1) # 进栈
stack.append(2)
print(stack.pop()) # 最后一个,出去
print(stack[-1]) # 最后一个元素,栈顶

3、栈的应用——括号匹配问题

def check_kuohao(s):
stack = []
for char in s:
print(stack)
if char in {'(', '{', '['}:
stack.append(char)
# 判断下一个是: ) } ]
elif char == ")":
if stack[-1] == '(' and len(stack) > 0:
stack.pop()
else:
return False
elif char == "}":
if stack[-1] == '{' and len(stack) > 0:
stack.pop()
else:
return False
elif char == "]":
if stack[-1] == '[' and len(stack) > 0:
stack.pop()
else:
return False
if len(stack) == 0:
return True
else:
return False strings = "([{()}])"
if check_kuohao(strings):
print('匹配')
else:
print('不匹配')

4、栈的应用——迷宫问题:深度优先

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,0,0,1],
[1,1,1,1,1,1,1,1,1,1]
]

1、解决思路:逆向游走算法

在一个迷宫节点(x,y)上,可以进行四个方向的探查:maze[x-1][y], maze[x+1][y], maze[x][y-1], maze[x][y+1]

2、栈实现

# -*- coding: utf-8 -*-
# @Time : 2018/08/01 0001 14:17
# @Author : Venicid
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, 0, 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], curNode[-1]) == (x2, 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 False mpath(2,2,8,8)

5、队列:先进先出

队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。

  

1、队列能否用list实现?

费时间,费内存

2、队列的使用:from collections import deque

from collections import deque
queue = deque() # q = ""
queue.append(1) # q = "1"
queue.append(2) # q = "1 2"
print(queue.popleft()) # q = "2"

3、队列的实现原理——环形队列:求余

环形队列:当队尾指针front == Maxsize + 1时,再前进一个位置就自动到0。
实现方式:求余数运算
队首指针前进1:front = (front + 1) % MaxSize
队尾指针前进1:rear = (rear + 1) % MaxSize
队空条件:rear == front
队满条件:(rear + 1) % MaxSize == front

6、队列的应用——迷宫问题:广度优先

  (1)思路

  (2)队列实现

# -*- coding: utf-8 -*-
# @Time : 2018/08/01 0001 14:46
# @Author : Venicid
mg = [
[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, 0, 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)
] from collections import deque 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], curNode[1]) == (x2, 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 # 标记我已经走过 else:
return False mgpath(2,2,8,8)

7、链表

1、节点

class Node(object):
def __init__(self, item=None):
self.item = item
self.next = None head = Node()
a = Node(86)
b = Node(19)
c = Node(4)
a.next = b
b.next = c
print(a.next.next.item)

2、链表的遍历

  

  

class Node(object):
def __init__(self, item=None):
self.item = item
self.next = None # 定义一个链表
head = Node()
head.next = Node(20)
head.next.next = Node(30) # 遍历列表
def traversal(head):
curNode = head # 临时用指针
while curNode is not None:
print(curNode.item)
curNode = curNode.next traversal(head)

3、链表节点的插入与删除

插入: O(1)
p.next = curNode.next
curNode.next = p

     

删除:O(1)
p = curNode.next
curNode.next = curNode.next.next
del p

     

4、建立链表

(1)头插法

       

(2)尾插法

         

5、双链表

  双链表中每个节点有两个指针:一个指向后面节点、一个指向前面节点

 

   

6、链表与列表的对比分析

                          列表   链表

按元素值查找                   O(n)
按下标查找 O(1) O(n)
在某元素后插入 O(n) O(1)
删除某元素 O(n) O(1)

8、Python中的集合与字典(了解)

(1)哈希表查找

哈希表(Hash Table,又称为散列表),是一种线性表的存储结构。通过把每个对象的关键字k作为自变量,通过一个哈希函数h(k),将k映射到下标h(k)处,并将该对象存储在这个位置。

例如:数据集合{1,6,7,9},假设存在哈希函数h(x)使得h(1) = 0, h(6) = 2, h(7) = 4, h(9) = 5,那么这个哈希表被存储为[1,None, 6, None, 7, 9]。

当我们查找元素6所在的位置时,通过哈希函数h(x)获得该元素所在的下标(h(6) = 2),因此在2位置即可找到该元素。

(2)哈希冲突

 哈希函数种类有很多,这里不做深入研究。
哈希冲突:由于哈希表的下标范围是有限的,而元素关键字的值是接近无限的,因此可能会出现h(102) = 56, h(2003) = 56这种情况。此时,两个元素映射到同一个下标处,造成哈希冲突。

(3)字典 O(1)

使用哈希表存储字典,通过哈希函数将字典的键映射为下标。假设h(‘name’) = 3, h(‘age’) = 1, h(‘gender’) = 4,则哈希表存储为[None, 18, None, ’Alex’, ‘Man’]

(4)列表

  

5 数据结构、栈、队列、链表、list、dict、迷宫问题的更多相关文章

  1. Python数据结构——栈的链表实现

    自定义链表实现栈的数据结构,代码如下: class Stack: def __init__(self): self._first = None def push(self,item): self._f ...

  2. 数据结构:队列 链表,顺序表和循环顺序表实现(python版)

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

  3. 数据结构 栈&队列

    2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...

  4. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  5. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  6. 数据结构应用实例#栈&单链表#简易计算器

    修改BUG的时候一不小心BUG越修越多,鉴于维护程序并不是学习数据结构的初衷,我已经果断的弃坑了!! 以下内容再不更新,Github上的代码直接无法正常编译运行.... 参考参考就好,学习到栈的作用就 ...

  7. 数据结构之队列and栈总结分析

    一.前言: 数据结构中队列和栈也是常见的两个数据结构,队列和栈在实际使用场景上也是相辅相成的,下面简单总结一下,如有不对之处,多多指点交流,谢谢. 二.队列简介 队列顾名思义就是排队的意思,根据我们的 ...

  8. LeetCode刷题总结-栈、链表、堆和队列篇

    本文介绍LeetCode上有关栈.链表.堆和队列相关的算法题的考点,推荐刷题20道.具体考点分类如下图: 一.栈 1.数学问题 题号:85. 最大矩形,难度困难 题号:224. 基本计算器,难度困难 ...

  9. java 集合 Connection 栈 队列 及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  10. Java 容器之 Connection栈队列及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

随机推荐

  1. C#关于微信昵称中存在的表情图标乱码解决

    //在获取微信用户信息时加密保存到数据库 System.Web.HttpUtility.UrlEncode("需要加密的字段") //前端在展示是解码 <script typ ...

  2. Sqlserver2014 迁移数据库

    由于当初安装sqlserver 的时候选择默认安装的路径,导致现在c盘爆满,安装不了其它软件.因此想到了迁移数据库,网上搜索了一些简介,但是缺少一些步骤,导致数据库附加的时候失败.现总结如下: 1.将 ...

  3. MySQL上机实习报告(一)

    一.实习内容    利用wamp进行MySQL上机实习,建立数据库和一个学生信息表,并能对建的表进行数据插入.修改.查询和删除等内容. 二.实习目的 能将课堂上所学的内容运用到实际的上机操作中,进一步 ...

  4. Invalid argument during startup: unknown conf file parameter : requirepass

    redis 设置来密码,出现来这个错误, 把配置文件那一行的 空格 去掉 # requirepass foobared 改成 requirepass 123456 因为# 和 requirepass ...

  5. C#.NET里面抽象类,接口,虚方法

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  6. SQL Server 数据表代码创建约束

    约束 非空约束 --NN,ont null constraint 必须填写数据不能为空 --指定表 Student 添加名为NN_Student_sClassId非空约束(指定列名sClassId), ...

  7. 定制controller转场动画

    定制controller转场动画 从iOS7开始就可以自由定制控制器间的转场动画了,以下实例描述最简单的定制方式,达到的效果如下所示: 为了实现这个效果需要这么多的文件-_-!!!! RootView ...

  8. 更改SQL实例端口

    为SQL Server使用非标准的端口 你正在使用标准的端口号1433来连接SQL Server 2005吗?你考虑过设置SQL Server来监听一个不同于1433的端口号吗?我曾经就是这样.在这篇 ...

  9. Python学习---模拟微信网页登录180410

    WEB微信 网页登录的猜想: a. 访问页面出现二维码 b. 长轮询监听是否已经扫码并且点击确认 c. 如何进行会话保持 d. 如何获取用户列表 e. 如何发送消息(接收消息) 过程:访问微信官网[h ...

  10. mysql常见问题总结

    061 如何删除表? 答案:运行命令 drop table table_name; 062 创建索引 对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成 ...