python实现队列_python实现队列

之前的文章里实现了线性表以及堆栈的数据结构,今天来实现一下单端队列,在这里笔者强烈建议一定要好好实现一遍链表,因为他真的真的太有用了,不管走到哪,他都真的真的太有用了。

队列 (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())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值