数据结构-队列

导读:本篇文章讲解 数据结构-队列,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

leetcode 622. 设计循环队列

解题重点:
1.指针下标超界问题,用if或者%将其避开

class MyCircularQueue:
	def __init__(self, k: int): 
		self.queue = [-1 for i in range(k)] 
		self.front = 0 
		self.rear = 0 
		self.length = 0 
		self.k = k
	def enQueue(self, value: int) -> bool: 
		if self.isFull():return False 
		self.queue[self.rear] = value 
		self.rear = self.rear + 1 if self.rear + 1 < self.k else 0 # (self.rear + 1 
		self.length += 1 
		return True
	
	def deQueue(self) -> bool: 
		if self.isEmpty():return False 
		self.queue[self.front] = -1 
		self.front = self.front + 1 if self.front + 1 < self.k else 0
		self.length -= 1 
		return True
	
	def Front(self) -> int: 
		return self.queue[self.front]
	
	def Rear(self) -> int: 
		return self.queue[self.rear - 1 if self.rear - 1 >= 0 else self.k - 1]
	
	def isEmpty(self) -> bool: 
		return self.length == 0
	
	def isFull(self) -> bool: 
		return self.length == self.k

leetcode 641. 设计循环双端队列

解题重点:
1.注意front和rear在删除和增加的时候下标的移动方向
2.注意初始值的设定

class MyCircularDeque:
	def __init__(self, k: int): 
		""" Initialize your data structure here. Set the size of the deque to be k. """ 
		self.arr = [-1 for _ in range(k)] 
		self.k = k 
		self.length = 0 
		self.head = 0 
		self.tail = 1
	
	def insertFront(self, value: int) -> bool: 
		""" Adds an item at the front of Deque. Return true if the operation is successful """ 
		if self.isFull():return False 
		#print(self.length) 
		self.arr[self.head] = value 
		self.head = self.head - 1 if self.head - 1 >= 0 else self.k - 1
		self.length += 1 
		return True
	
	def insertLast(self, value: int) -> bool: 
		""" Adds an item at the rear of Deque. Return true if the operation is successful. """ 
		if self.isFull(): 
			return False 
		self.arr[self.tail] = value 
		self.tail = (self.tail + 1) % self.k 
		self.length += 1 
		return True
	
	def deleteFront(self) -> bool: 
		""" Deletes an item from the front of Deque. Return true if the operation is succe """ 
		if self.isEmpty():return False 
		self.head = (self.head + 1) % self.k 
		self.arr[self.head] = -1 
		self.length -= 1 
		return True
	
	def deleteLast(self) -> bool: 
		""" Deletes an item from the rear of Deque. Return true if the operation is succes """ 
		if self.isEmpty():return 
		self.tail = self.tail - 1 if self.tail - 1 >= 0 else self.k - 1
		self.arr[self.tail] = -1 
		self.length -= 1 
		return True
	
	def getFront(self) -> int: 
		""" Get the front item from the deque."""
		# print(self.arr) 
		# print(self.head) 
		# print(self.tail) 
		return self.arr[(self.head + 1) % self.k]
	
	def getRear(self) -> int: 
		""" Get the last item from the deque. """ 
		return self.arr[self.tail - 1 if self.tail - 1 >= 0 else self.k - 1]
	def isEmpty(self) -> bool: 
		""" Checks whether the circular deque is empty or not. """ 
		return self.length == 0
	
	def isFull(self) -> bool: 
	""" Checks whether the circular deque is full or not. """ 
		return 	self.length == self.k

leetcode 1670. 设计前中后队列

解题重点:
1.前中后队列,使用双向链表加3指针方便操作,注意判断只要1、2元素队列的情况
2.如果用列表则简单至极

class Node:
	def __init__(self, val): 
		self.val = val 
		self.next = self.prev = None
	
class FrontMiddleBackQueue: 
	def __init__(self): 
		self.head = self.tail = self.mid = None 
		self.sign = False #作为链表当前奇偶判断,True为奇数,False为偶数
	
	def pushFront(self, val: int) -> None: 
		if not self.head:#判断队列为空的情况 
			self.head = self.tail = self.mid = Node(val) 
			self.sign = True 
			return
	
		self.head.prev = Node(val) 
		self.head.prev.next = self.head 
		self.head = self.head.prev #将头节点链接新节点,并将head指针移到前面 
		if self.sign: 
			self.mid = self.mid.prev 
			self.sign = False 
		else:
			self.sign = True
	
	def pushMiddle(self, val: int) -> None: 
		if not self.head:#判断队列为空的情况 
			self.head = self.tail = self.mid = Node(val) 
			self.sign = True 
			return
		node = Node(val)
	
	   if self.sign:#判断当前队列奇偶 
	   	self.sign = False#为奇数则添加元素后变为偶数 
	   	if self.mid.prev:#判断是否是单个元素的队列 
	   		self.mid.prev.next = node 
	   		node.prev = self.mid.prev 
	   		self.mid.prev = node 
	   		node.next = self.mid 
	   		self.mid = node 
	   	else:#如果是单个元素,将头和mid放最前面 
	   		self.mid.prev = node 
	   		node.next = self.mid 
	   		self.head = self.mid = node 
	   else:#偶数的情况要么0个,要么2个以上 
	   		node.next = self.mid.next 
	   		self.mid.next = node.next.prev = node 
	   		node.prev = self.mid self.mid = node 
	   		self.sign = True
	
	def pushBack(self, val: int) -> None: 
		if not self.head:#判断队列为空的情况 
			self.head = self.tail = self.mid = Node(val) 
			self.sign = True 
			return 
		self.tail.next = Node(val) 
		self.tail.next.prev = self.tail 
		self.tail = self.tail.next 
		if self.sign: 
			self.sign = False 
		else:
			self.mid = self.mid.next 
			self.sign = True
	
	def popFront(self) -> int: 
		if not self.head:#判断队列为空的情况 
			return -1 
		res = self.head.val 
		self.head = self.head.next 
		if not self.head: 
			self.mid = self.tail = None 
			self.sign = False 
			return res 
		
		self.head.prev = None 
		if self.sign: 
			self.sign = False 
		else:
			self.mid = self.mid.next 
			self.sign = True 
		return res
	
	def popMiddle(self) -> int: 
		if not self.head:#判断队列为空的情况 
			return -1
		res = self.mid.val
		if not self.head.next:#表示只有一个元素的队列情况 
			self.head = self.mid = self.tail = None 
			self.sign = False 
			return res
		
		if not self.mid.prev:#表示只有两个元素的情况下 
			self.head = self.mid = self.tail = self.mid.next
			self.head.prev = None 
			self.sign = True 
			return res
		
		self.mid.prev.next = self.mid.next 
		self.mid.next.prev = self.mid.prev
		if self.sign: 
			self.mid = self.mid.prev 
			self.sign = False 
		else:
			self.mid = self.mid.next 
			self.sign = True 
		return res
	
	def popBack(self) -> int: 
		if not self.head:#判断队列为空的情况 
			return -1 
		res = self.tail.val 
		self.tail = self.tail.prev 
		if not self.tail:#表示删除前只有一个元素的情况下 
			self.mid = self.head = None 
			self.sign = False 
			return res 
		
		self.tail.next = None 
		if self.sign: 
			self.mid = self.mid.prev 
			self.sign = False 
		else:
			self.sign = True 
		return res

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76901.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!