之前的文章里实现了线性表以及堆栈的数据结构,今天来实现一下单端队列,在这里笔者强烈建议一定要好好实现一遍链表,因为他真的真的太有用了,不管走到哪,他都真的真的太有用了。
队列 (queue) 是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列符合先进先出[FIFO]的原则。因为要排队的第一个项目,最终将是第一个要出列的项目,如在现实生活中的队列,先来的站在队列前面,后来的就只能站在队列后面啦。
队列有两种实现形式,分为两种:数组和链表。
在接下来的内容里,我们将以链表的形式实现队列,逐步介绍具体功能是如何实现的。
1. 创建 Node 类
创建一个 Node 的类,作为基础数据结构:链点,并初始化对应的内参。
class Node(): #实现节点类
def __init__(self,value):
self.val = value
self.next = None
是不是跟链表很像?
2. 创建 Queue 类
创建一个 Queue 的类,以链表形式的队列,并初始化对应的内参。
具体实现代码如下:
class My_Queue():
def __init__(self):
self.head = None #头部节点为None
self.rear = None #尾部节点为None
self.count = 0 #用来记录队列的长度的
3. 添加 is_empty 函数
添加一个 is_empty 的函数,功能是判断队列是否为空
具体实现代码如下:
def is_empty(self): #判断队列的长度
return self.head is None #self.head == None
4. 添加 in_queue 函数
添加一个 in_queue(elem) 函数,功能是往队列中添加一个 elem 元素
效果演示:往已知队列[29,9,53]里面添加一个 80 元素
def in_queue(self,value): #功能是往队列中添加一个value元素
node = Node(value)
if self.is_empty(): #判断队列是否为空
self.head = node
self.rear = node
self.count += 1
else:
self.rear.next = node #队列尾部的后继是这个新的点
self.rear = node #然后让队列尾部指针指向这个新的点
self.count += 1
5. 添加 de_queue 函数
添加一个 dequeue() 函数,功能是从队列头部删除一个元素
流程如下:先判断队列是否为空,为空即退出 dequeue 操作,不为空即继续后续操作
temp = head 设置一个 temp 指针,使它的指针指向队列头部
head = head.next 队列头部指针,使之指向队列头部的后继(即队列头部元素出队)
delete temp 删除 temp 指针
def de_queue(self): #功能是从队列头部删除一个元素
if self.is_empty():
print('Queue_is_empty') #若队列为空,则退出 dequeue 操作
self.count -= 1
return
else:
result = self.head.val #删除的值
self.head = self. head.next
self.count -= 1
return result
6. 添加 peek 函数
添加一个 peek() 函数,功能是查看队列头部的元素
流程如下:判断队列是否为空,为空即返回 NOT_FOUND
队列如果不为空,返回队列头部元素
def peek(self): #功能是查看队列队头的元素的值
if self.is_empty():
return None
else:
result = self.head.val
return result
7. 添加 print_queue 函数
添加一个 print_queue() 函数,功能是展现队列的元素
def print_queque(self):
print("queue:")
tmp = self.head
my_queue = []
while tmp:
my_queue.append(tmp.val)
tmp = tmp.next
print(my_queue)
8. 判断队列长度:
def length(self):
return self.count
最终代码如下:
class Node(): #实现节点类
def __init__(self,value):
self.val = value
self.next = None
class My_Queue():
def __init__(self):
self.head = None #头部节点为None
self.rear = None #尾部节点为None
self.count = 0
def is_empty(self): #判断队列的长度
return self.head is None #self.head == None
def length(self):
return self.count
def in_queue(self,value): #功能是往队列中添加一个value元素
node = Node(value)
if self.is_empty(): #判断队列是否为空
self.head = node
self.rear = node
self.count += 1
else:
self.rear.next = node #队列尾部的后继是这个新的点
self.rear = node #然后让队列尾部指针指向这个新的点
self.count += 1
def de_queue(self): #功能是从队列头部删除一个元素
if self.is_empty():
print('Queue_is_empty') #若队列为空,则退出 dequeue 操作
self.count -= 1
return
else:
result = self.head.val #删除的值
self.head = self. head.next
self.count -= 1
return result
def peek(self): #功能是查看队列队头的元素的值
if self.is_empty():
return None
else:
result = self.head.val
return result
def print_queque(self):
print("queue:")
tmp = self.head
my_queue = []
while tmp:
my_queue.append(tmp.val)
tmp = tmp.next
print(my_queue)
if __name__ == "__main__":
a = My_Queue()
a.in_queue(0)
a.in_queue(3)
a.in_queue(10)
a.de_queue()
a.print_queque()
print(a.length())