简介
- 数据结构是指互相之间存在着一种或多种关系的数据元素的集合,和该集合中数据元素之间的关系组成
- 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中,例如列表、字典等
分类
- 按照其逻辑结构可分为线性结构、树结构、图结构
- 线性结构:数据结构中的元素存在是一对一的相互关系
- 树结构:数据结构中的元素存在一对多的相互关系
- 图结构:数据结构中的元素存在多对多的相互关系
列表/数组
- 列表(其他语言称数组)是一种基本数据类型
- 数组与列表的两点不同:数组的元素类型要相同;数组的长度固定
- c的内存存的是数,python的内存存的是地址,地址指向数
- 关于列表的问题:
- 列表中的元素是如何存储的?顺序
- 列表的基本操作:按下表查找、插入元素、删除元素...
- 操作的时间复杂度?
- index() O(1)
- append O(1)
- pop() O(1)
- pop(i) O(n)
- insert(i,item) O(n)
- del operator O(n)
- iteration O(n)
- contains(in) O(n)
- get slice[x:y] O(k)
- del slice O(n)
- set slice O(n+k)
- reverse O(n)
- concatenate O(k)
- sort O(nlogn)
- multiply O(nk)
栈 (Stack)
- 栈是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表
- 栈的性质:后进先出LIFO(last-in,first-out)
- 栈的概念:栈顶top、栈底buttom
- 栈的基本操作:
- 进栈(压栈):push
- 出栈:pop
- 取栈顶:getpop(只取值,不出栈)
- 使用一般的列表实现栈
- 进栈:li.append()
- 出栈:li.pop()
- 取栈顶:li[-1]
代码:
calss Stack:
def __init__(self):
self.stack = []
def push(self, element):
self.stack.append(element)
def pop(self):
return self.stack.pop()
def get_top(self):
if len(self.stack) > 0:
return self.stack[-1]
else:
return None
def is_empty:
return len(self.stack) == 0
类(Class)和模块(Module)的编写规范
- camel case:小驼峰lowerCamelCase,大驼峰UpperCamelCase
- snake case:全部单词小写用下划线连接
- 类名:camel case
- 实例和模块:snake case
- 用空行组织代码:方法之间一个空行,类之间两个空行
栈的应用——括号匹配问题
- 给一个字符串,其中包括小括号、中括号、大括号,要求判断该字符串中的括号是否匹配
代码:
def brace_match(s):
match = {'}':'{', ']':'[', ')':'('}
stack = Stack()
for ch in s:
if ch in {'(', '[', '{'}:
stack.push(ch)
else: #ch in {')', ']', '}'}
if stack.is_empty:
return False
elif stack.get_top() == match[ch]:
stack.pop()
else: #stack.get_top() != match[ch]
return False
if stack.is_empty:
return True
else:
return False
队列(Queue)
- 队列是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除
- 进行插入的一端称为队尾(rear),插入动作称为进队或入队
- 进行删除的一端称为队头(front),删除动作称为出队
- 队列的性质:先进先出FIFO(first-in,first-out)
队列的实现方式——环形队列
- 环形队列:当队尾指针rear==Maxsize+1时,再前进一个位置就自动到0
- 队首指针前进1:front=(front+1)%Maxsize
- 队尾指针前进1:rear=(rear+1)%Maxsize
- 队空条件:rear==front
- 队满条件:(rear+1)%Maxsize==front
代码:
class Queue:
def __init__(self, size=100):
self.queue = [0 for _ in range(size)]
self.size = size
self.rear = 0 #队尾
self.front = 0 #队首
def push(self, element):
if not self.is_filled():
self.rear = (self.rear+1) % self.size
self.queue[self.rear] = element
else:
raise IndexError('Queue is filled.')
def pop(self):
if not self.is_empty():
self.front = (self.front+1) % self.size
return self.queue[self.front]
else:
raise IndexError('Queue is empty.')
def is_empty(self):
return self.rear == self.front
def is_filled(self):
return (self.rear+1) % self.size == self.front
双向队列
- 两端都支持进队和出队操作
- 基本操作:
- 队首进队
- 队首出队
- 队尾进队
- 队尾出队
python队列内置模块
- from collections import deque
- 创建队列:queue=deque()
- 进队:append()
- 出队:popleft()
- 双向队列队首进队:appendleft()
- 双向队列队尾出队:pop()