点击上方”python宝典”,关注获取python全套视频,
技术文章第一时间送达!
一、什么是数据结构?
数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。
“程序=数据结构+算法”
二、数据结构的分类
数据结构按照其逻辑结构可分为线性结构、树结构、图结构
下面就来说说线性结构
三、线性结构
(1)栈
1、定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表。
2、栈的特点:后进先出(last-in,first-out),简称LTFO表
3、栈的概念:
4、栈的基本操作:
如图:
5、栈的Python实现
不需要自己定义,使用列表结构即可。
li = []
li.append(1)
li.append(2)
li.append(3)
print(li)
print(li.pop())
print(li.pop())
print(li.pop())
# print(li.pop()) #当栈空的时候就会报错
# print(li[-1]) #查看栈顶元素
6、栈的应用—-括号匹配问题
问题:给一个字符串,其中包含小括号,中括号,大括号,求该字符串中的括号是否匹配
例如:
()()[]{} 匹配
([{()}]) 匹配
[]( 不匹配
[(]) 不匹配
代码如下:
# 方式一
def brace_match(s):
'''括号匹配问题'''
stack = []
# {()}[]
match = {')': '(', '}': '{', ']': '['}
match2 = {'(': ')', "{": "}", "[": "]"}
for ch in s:
# print(i)
if ch in {'(', '{', '['}: # 如果左括号在里面就把左括号添加进去,等待和右括号匹配
stack.append(ch)
elif len(stack) == 0: # 如果再次进来括号的时候,这时候发现栈空了,说明缺少了左括号了
print('缺少了%s' % match[ch])
return False
elif stack[-1] == match[ch]: # 比如栈顶元素是(,ch=')'
stack.pop()
else:
print('括号不匹配')
return False
if len(stack) 0: # 如果栈剩余了,说明缺少了右括号
print('缺少了%s' % match2[stack[-1]])
return False
return '匹配成功'
# 方式二
def check_kuohao(s):
stack = []
for char in s:
if char in {'(', '[', '{'}:
stack.append(char)
elif char == ')':
if len(stack) 0 and stack[-1] == '(':
stack.pop()
else:
return False
elif char == ']':
if len(stack) 0 and stack[-1] == '[':
stack.pop()
else:
return False
elif char == '}':
if len(stack) 0 and stack[-1] == '{':
stack.pop()
else:
return False
if len(stack) == 0:
return True
else:
return False
ret = brace_match('{()}]')
print(ret)
print(check_kuohao('{()}]'))
(2)队列
1、介绍
双向队列:对列的两端都允许进行进队和出队操作

2、队列的实现
队列能否简单用列表实现?为什么?

3、队列的实现原理—–环形对列


环形队列:当队尾指针front == Maxsize + 1时,再前进一个位置就自动到0。
4、对列的内置模块
使用方法:from collections import deque #deque是支持双向队列的
from collections import deque
queue = deque()#创建队列
queue.append('first')
queue.append('second')
queue.append('third')
print(queue.popleft())
print(queue.popleft())
print(queue.popleft())#出队,,先进先出
print([i for i in queue]) #查看队列里的元素
queue.appendleft('one')#双向队列队首进队
queue.appendleft('two')#双向队列队首进队
queue.appendleft('five')#双向队列队首进队
print(queue.pop())
print(queue.pop())#双向队列从队尾出队
print([i for i in queue])
#单向队列
from queue import Queue
q = Queue()
q.put('a')
q.put('b')
q.put('c')
print(q.get()) #a
(3)单链表
链表中每一个元素都是一个对象,每一个对象都是一个节点,包含有数据域key和指向下一个节点的指针next。通过各个节点之间的互相连接,最终串联成一个列表

1、节点定义:
class Node(object):
def __init__(self, item):
self.item = item
self.next = None
2、建立链表
头插法

尾插法

3、链表的遍历

4、链表节点的插入和删除
# 插入:
p.next = curNode.next
curNode.next = p
#删除:
p = curNode.next
curNode.next = p.next #当前节点的下一个指向就指向他下一个的下一个
del p
插入:


删除:



** (4)双链表**
双链表中的每个节点有两个指针:一个指向后面节点、一个指向前面节点
1、节点定义:
class Node(object):
def __init__(self,item):
self.item = item #数据
self.next = None #下一个指向
self.prior = None #上一个指向

2、双链表节点的插入和删除
#插入
p.next = curNode.next
curNode.next.prior = p
p.prior = curNode
curNode.next = p
#删除
p = curNode.next
curNode.next = p.next
p.next.prior = curNode
del p





(5)哈希表
哈希表(又称为散列表),是一种线性表的存储结构。哈希表由一个顺序表(数组)和一个哈希函数组成。哈希函数h(k)将k作为自变量,返回元素的存储下标。
1、简单哈希函数
假设有一个长度为7的数组,哈希函数h(k)=k%7。元素集合{14,22,3,5}的存储方式如下图。


2、哈希冲突
由于哈希表的大小是有限的,而要存储的值的总数量是无限的,因此对于任何哈希函数,都会出现两个不同元素映射到同一个位置上的情况 ,
这种情况叫做哈希冲突。
比如h(k)=k%7, h(0)=h(7)=h(14)=…
3、解决哈希冲突的办法
开放寻址法:如果哈希函数返回的位置已经有值,则可以向后探查新的位置来存储这个值。
拉链法:哈希表每个位置都连接一个链表,当冲突发生时,冲突的元素将被加到该位置链表的最后。

4、哈希表在Python中的应用
a、字典与集合都是通过哈希表来实现的
b、 在Python中的字典:a = {‘name’: ‘Alex’, ‘age’: 18, ‘gender’: ‘Man’},使用哈希表存储字典,通过哈希函数将字典的键映射为下标。
假设h(‘name’) = 3, h(‘age’) = 1, h(‘gender’) = 4,则哈希表存储为[None, 18, None, ’Alex’, ‘Man’]
c、在字典键值对数量不多的情况下,几乎不会发生哈希冲突,此时查找一个元素的时间复杂度为O(1)。

识别图中二维码,欢迎关注python宝典