数据结构:数据元素的集合 + 数据元素之间的关系
列表
1、特点:
顺序存储
插入和删除 O(n)
2、与数组的区别:
数组的元素类型相同,数组长度固定
栈
1、特点:
一个数据集合,后进先出
使用一般的列表结构可以实现栈
2、应用:
括号匹配问题
思路:左括号进栈,右括号则判断栈顶匹配时出栈
class Stack:
def __init__(self):
self.stack = []
def push(self,element):
self.stackappenf(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 brace_match(s):
"""括号匹配问题"""
match = {'}':'{', ']':'[', ')':'('}
stack = Stack()
for ch in s:
if ch in {'{', '[', '('}:
stack.push(ch)
else:
if stack.is_empty():
return False
elif stack.get_top() == match[ch]:
stack.pop()
else: # 否则报错
return False
# 如果最后栈空了,则说明成功
if stack.is_empty():
return Ture
else:
return False
print(brace_match('[{}][]{()}')
队列
1、特点:
一个数据集合,先进先出
使用一般的列表结构可以实现队列
2、环形队列:当front = MaxSize-1时,再前进一个位置就自动到0
队空:rear == front
队满:(rear + 1) % MaxSize == front
队首指针前进1:front = (front+1) % MaxSize
队尾指针前进1:rear = (rear+1) % MaxSize
3、python队列内置模块:当队满时,会自动出队
from collection import deque
q = deque()
q.append(1) 队尾进队
q.appendleft(1) 队首进队
q.pop() 队尾出队
q.popleft() 队首出队
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
q = Queue(5)
for i in range(4):
q.push(i)
q.pop()
链表
1、特点:
内存分配更灵活
在插入删除操作上明显快于顺序表
对树和图的结果有很大的启发性
2、复杂度分析:
按下标查找:O(1)
按元素值查找:O(n)
在某元素后插入: O(n)
删除某元素: O(n)
class Node:
"""链表结点"""
def __init__(self, item):
self.item = item
self.next = None
def creat_linklist_head(li):
"""头插法"""
head = Node(li[0])
for element in li[1:]:
node = Node(element)
node.next = head
head = node
return head
def creat_linklist_tail(li):
"""尾插法"""
head = Node(li[0])
tail = head
for element in li[1:]:
node = Node(element)
tail.next = head
tail = node
return head
def print_linklist(lk):
"""打印列表"""
while lk:
print(lk.item, end=',')
lk = lk.next
lk = create_linklist_head([1,2,5,7])
print_linklist(lk)