列表
存储方式
顺序存储
C数组与python列表的区别
1.数组元素类型相同
2.数组长度固定
C数组
32位机器上,一个整数占4字节
64位机器上,一个整数占8字节
因此数组里存的都是值
python列表
列表里存的是地址,再指向值
相关操作的时间复杂度
查找:index O(1)
增加:append O(1)
插入:insert O(n)
删除:pop remove O(n)
栈
定义
可以理解为只能在一端进行插入或删除操作的列表
特点
先进后出,可以想象成电梯(先进来的在最里面,也是最后走的)
相关操作
进栈:push
出栈:pop
取栈顶:gettop(看值不取 出来)
代码实现
class 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(self):
return len(self.stack) == 0
栈的应用:括号匹配问题
思路
每次读入一个字符,若是( { [ 则push,若是 } ] ),则与栈底相比较,相匹配则输出
代码实现
from stack import Stack
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 True
else:
return False
print(brace_match('[{}[()]])'))
print(brace_match('[]{()}'))
队列
定义
仅允许在列表的一端进行插入,另一端进行删除
相关操作
进行插入的一段成为队尾(rear),插入动作成为进队 入队
进行删除的一段成为队头(front),删除动作成为出队
性质
先进先出
队列的实现方式–环形队列
空队列:rearfront
队满:rear + 1 front % Mazsize
关键的问题:当队尾指针front = Mazsize + 1时,自动进到下一个位置0
队首/队尾指针+1 front/rear = front/rear + 1
代码实现
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('Queen if filled!')
def pop(self):
if not self.is_empty():
self.front = (self.front + 1) % self.size
return self.queue[self.front]
else:
raise IndexError('Queen 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)
print(q.is_filled())
print(q.pop())
双向队列
两边均可进行出队和进队
python内置模块
参数说明
q = deque([元素],队长度)
注意如果队满后,会自动让队首出队
from collections import deque
q = deque()
q.append(1) #队尾进队
print(q.popleft()) #队首出队
#用于双向队列
q.appendleft(1) #队首进队
print(q.pop()) #队尾出队
#相关参数
q = deque([1,2,3,4,5],5)
q.append(6)
print(q.popleft())
linux_tail命令
问题
打印文件后五行:
wefjio
rfqerfdsnajkc
dfamfnkoa
1432
fgqefgji
fwjia
3245
gegf
5
代码实现
from collections import deque
def tail(n):
with open('linux-tail.txt','r') as f:
q = deque(f,n)
return q
for line in tail(5):
print(line,end='')