一、队列:常应用于按顺序操作元素
先进先出
队列的实现(可使用数组和指向队列头部的索引实现)
class queue(): def _init_(self): self._list = [] def enqueue(self, item): #入队 self._list.append(item) def dequeue(self): #删除 if self._list: return(self._list.pop()) else: return None def is_empty(self): return self._list == [] def size(self): return len(self._list)
随着入队等操作越多,浪费许多空间,尤其对于有空间限制时,例:只能分配一个长度为5的列表(数组)
循环队列:使用固定大小的数组和两个指针指示起始位置和结束位置
# 循环队列(设计一个容量为k的循环队列) class circularqueue(): def __init__(self,k): """ :type k: int """ self.queue = [0] * k # 定义实现储存队列长度为k的列表(队列) self.count = 0 # 定义列表目前的元素数 self.headindex = 0 # 定义列表的头部索引 self.capacity = k # 定义列表的容量大小 def enqueue(self, value): # 向循环队列插入元素 if self.count == self.capacity: return False else: self.queue[(self.count+self.headindex)%self.capacity] = value self.count +=1 def dequeue(self): # 向循环队列删除元素 if self.count == 0: return False else: self.headindex = (self.headindex+1)%self.capacity self.count -=1 def front(self): # 返回队首元素 if self.count == 0: return -1 else: return self.queue[(self.headindex)] def rear(self): # 获取队尾元素 if self.count == 0: return -1 else: return self.queue[(self.headindex+self.count-1)%self.capacity] def isEmpty(self): #判断队是否为空 return self.count == 0 def isFull(self): #判断队是否满队 return self.count == self.capacity
二、栈: 常应用反转,例:反转链表
先进后出
import math # 实现一个栈,以及返回栈中最小的元素 ` class stack(): def __init__(self): self.stack = [] self.min = [math.inf] #math.inf代表浮点正无穷大 def push(self,item): self.stack.append(item) self.min.append(min(item, self.min[-1])) def pop(self): self.stack.pop() # pop默认最后一个 self.min.pop() def gettop(self): return self.stack[-1] def getmin(self): return self.min[-1]end(item) self.min.append(min(item, self.min[-1]))