标签:list size 入队 对象存储 pat for dir 简单 python
什么是数据结构?
列表
栈
栈的Python实现
栈的应用——括号匹配问题
括号匹配问题——实现
1 def check_kuohao(s): 2 stack = [] 3 for char in s: 4 if char in {‘(‘, ‘[‘, ‘{‘}: 5 stack.append(char) 6 elif char == ‘)‘: 7 if len(stack) > 0 and stack[-1] == ‘(‘: 8 stack.pop() 9 else: 10 return False 11 elif char == ‘]‘: 12 if len(stack) > 0 and stack[-1] == ‘[‘: 13 stack.pop() 14 else: 15 return False 16 elif char == ‘}‘: 17 if len(stack) > 0 and stack[-1] == ‘{‘: 18 stack.pop() 19 else: 20 return False 21 if len(stack) == 0: 22 return True 23 else: 24 return False
栈的应用——迷宫问题
给一个二维列表,表示迷宫(0表示通道,1表示围墙)。给出算法,求一条走出迷宫的路径。
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 dirs = [lambda x, y: (x + 1, y), lambda x, y: (x - 1, y), 2 lambda x, y: (x, y - 1), lambda x, y: (x, y + 1)] 3 def mgpath(x1, y1, x2, y2): 4 stack = [] 5 stack.append((x1, y1)) 6 while len(stack) > 0: # 栈不空时循环 7 curNode = stack[-1] # 查看栈顶元素 8 if curNode[0] == x2 and curNode[1]: 9 # 到达终点 10 for p in stack: 11 print(p) 12 break 13 for dir in dirs: 14 nextNode = dir(*curNode) 15 if mg[nextNode[0]][nextNode[1]] == 0: # 找到了下一个方块 16 stack.append(nextNode) 17 mg[nextNode[0]][nextNode[1]] = -1 # 标记为已经走过,防止死循环 18 break 19 else: 20 mg[curNode[0]][curNode[1]] = -1 # 死路一条 21 stack.pop() 22 return False
队列
队列的实现
队列的实现原理
队列的实现原理——环形队列
队列的实现原理——环形队列
队列的应用——迷宫问题
迷宫问题——队列实现
1 def mgpath(x1, y1, x2, y2): 2 queue = deque() 3 path = [] 4 queue.append((x1, y1, -1)) 5 while len(queue) > 0: 6 curNode = queue.popleft() 7 path.append(curNode) 8 if curNode[0] == x2 and curNode[1] == y2: 9 #到达终点 10 print(path) 11 return True 12 for dir in dirs: 13 nextNode = dir(curNode[0], curNode[1]) 14 if mg[nextNode[0]][nextNode[1]] == 0: # 找到下一个方块 15 queue.append((*nextNode, len(path) - 1)) 16 mg[nextNode[0]][nextNode[1]] = -1 # 标记为已经走过 17 return False
链表
链表中每一个元素都是一个对象,每个对象称为一个节点,包含有数据域key和指向下一个节点的指针next。通过各个节点之间的相互连接,最终串联成一个链表。
节点定义:
class Node(object): def __init__(self, item): self.item = item self.next = None
头结点
链表的遍历
def traversal(head): curNode = head # 临时用指针 while curNode is not None: print(curNode.data) curNode = curNode.next
链表节点的插入和删除
建立链表
1 def createLinkListF(li): 2 l = Node() 3 for num in li: 4 s = Node(num) 5 s.next = l.next 6 l.next = s 7 return l
尾插法:
1 def createLinkListR(li): 2 l = Node() 3 r = l #r指向尾节点 4 for num in li: 5 s = Node(num) 6 r.next = s 7 r = s
双链表
双链表中每个节点有两个指针:一个指向后面节点、一个指向前面节点。
节点定义:
1 class Node(object): 2 def __init__(self, item=None): 3 self.item = item 4 self.next = None 5 self.prior = None
双链表节点的插入和删除
建立双链表
1 def createLinkListR(li): 2 l = Node() 3 r = l 4 for num in li: 5 s = Node(num) 6 r.next = s 7 s.prior = r 8 r = s 9 return l, r
链表-分析
Python中的集合与字典(了解)
解决哈希冲突:
标签:list size 入队 对象存储 pat for dir 简单 python
原文地址:http://www.cnblogs.com/liyongsan/p/7852886.html