数据结构:
线性结构,元素存在一对一的关系,例如列表
树结构,元素存在一对多的关系,例如层级结构
图结构,元素存在多对多的关系,例如地图
列表:
1、列表中的元素是怎么存储的?
是顺序存储的,是一块连续的内存
2、列表的操作:按下标查找,插入元素,删除元素
先说C中的数组:
查找的时间复杂度是O(1),因为知道首地址+每个元素的大小*index就找到了地址
数组与列表有两点不同:
1、数组元素类型要相同
2、数组长度固定
python中的列表如何实现?
Python中列表的类型可以不同
Python中的列表存放的不是值而是地址,32位机器一个地址占4个字节,地址的长度是固定的
列表长度不固定
Python解释器自动维护的,发现长度不够会新开辟一块内存,把之前的列表进行拷贝
python下标查找和append复杂度是O(1)
python列表的插入和删除的复杂度是O(n)
栈:
栈(stack)是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表
栈的特点:LIFO
栈的概念:栈顶,栈底
栈的基本操作:(用列表可以实现)
进栈:li.append
出栈: li.pop()
取栈顶: li[-1]
class Stack(object):
def __init__(self):
self.stack = []
def pop(self):
return self.stack.pop()
def push(self, element):
return self.stack.append(element)
def get_top(self):
if self.stack:
return self.stack[-1]
else:
return None
栈的应用:括号匹配问题 '{[()[]{}]}'遇到左括号就入栈,遇到右括号就看栈顶的左括号,把匹配的左括号出栈,匹配完后栈为空说明匹配。
队列:
队列的实现:
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 self.is_filled(): raise IndexError("Queue is filled.") self.rear = (self.rear + 1) % self.size self.queue[self.rear] = element def pop(self): if self.is_empty(): raise IndexError("Queue is empty.") self.front = (self.front + 1) % self.size return self.queue[self.front] def is_empty(self): return self.rear == self.front def is_filled(self): return (self.rear + 1) % self.size == self.front q = Queue(5) for i in range(4): q.push(i) print(q.is_filled())