栈和队列(4)(用链表实现队列)

        在一开始写用链表实现队列的时候,当时很蠢,没想到使用链表的变形来进行操作,所以写的程序效率非常低,后来就去学了以下单链表的变形。在用链表实现队列的时候由于是一端入队,另一端出队的操作,并且链表的首端尾front,后端尾rear,在进行入队操作的时候需要不断的链表的尾端插入数据,如果使用传统的单链表的方法来写,每一次入队的时间复杂度的都是O(n),效率太低,此时,如果稍稍修改一下,添加一个尾结点域,就是添加一个指向:头结点始终指向尾结点,此时,每次进行入队操作的时间复杂度就变成了O(1),大大的降低了操作的复杂度。

链表实现队列不限制长度的代码实现:

# author     HeiJack
# Time       2021-6-28


# 队的链表实现
# 不设置队的长度
# 链表首端为front,尾端为rear
'''之前写的很有问题,入队操作应该增加尾结点域来提高运行效率
效率可以从O(n)提升到O(1)'''



class Node:
    def __init__(self, elem):
        self.elem = elem
        self.next = None


class LLQueue(object):
    # 头结点的创建
    def __init__(self):
        self.head = None     # 头结点域
        self.rear = None     # 尾结点域

    # 判断是否为空
    def isempty(self):
        return self.head is None

    # 入队
    def enqueue(self, elem):
        # 空表
        if self.rear is None:
            self.rear = Node(elem)
            self.head = self.rear
            '''当尾结点为空时,首结点必为空,不可能出现尾结点为None
而首结点不为None的情况'''
        else:
            self.rear.next = Node(elem)
            self.rear = self.rear.next

    # 出队
    def dequeue(self):
        '''出队操作就是删除首结点,不难理解,很简单'''
        if self.head is None:
            return print('queue is empty')
        else:
            e = self.head.elem
            self.head = self.head.next
            return e


    # 取得队首元素
    '''与出队操作类似'''
    def plast(self):
        if self.head is None:
            return print("queue is empty")
        else:
            return self.head.elem


    # 遍历并打印
    def travel(self):
        q = self.head
        while q is not None:
            print(q.elem)
            q = q.next




if __name__ == '__main__':
    qu = LLQueue()
    for i in range(13):
        qu.enqueue(i)

    for i in range(6):
        qu.dequeue()


    qu.travel()
    qu.isempty()
    qu.plast()

实验结果:

链表实现队列限制长度的代码实现:

# author     HeiJack
# Time       2021-6-28


# 队的链表实现
# 设置队的长度
# 链表首端为front,尾端为rear




class Node:
    def __init__(self, elem):
        self.elem = elem
        self.next = None


class LLQueue(object):
    '''这里有rear,num,head三个变量需要不断的维护'''

    def __init__(self, size):     # size 是队的长度
        self. head = None
        self.rear = None          # 尾结点域
        self.num = 0              # 队现有的长度num
        self. size = size         # 规定队的长度size

    # 入队
    def enqueue(self, elem):
        '''由于前端是front,后端是rear,所以入队操作是在链表的最后添加元素,需要
        频繁的在链表尾部添加元素,所以这里增加一个尾结点域来提升程序的效率'''
        # 空表
        if self.rear is None:
            self.rear = Node(elem)
            self.head = self.rear
            self.num = self.num + 1
        else:
            self.rear.next = Node(elem)
            self.rear = self.rear.next
            self.num = self.num + 1

    # 出队
    def dequeue(self):
        if self.num == 0:
            return print('queue is empty')
        else:
            q = self.head
            self.head = q.next
            self.num = self.num - 1

    # 遍历并打印
    def travel(self):
        q = self.head
        while q is not None:
            print(q.elem)
            q = q.next



if __name__ =='__main__':
    q = LLQueue(42)
    q.enqueue(5)
    q.enqueue(9)
    q.enqueue(53)
    q.dequeue()
    q.travel()








实验结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灰基客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值