数据结构和算法----队列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bquau/article/details/88894944

队列

  • 定义

通俗点的定义就是,排队买票,先到的先买。就是先进先出。队列和栈一样都是操作受限的线性表数据结构

  • 入队,出队

在队尾入队,队头出队。同样想象买票的流程。除非你经常插队要不很容易理解!

  • 实现方式

顺序队列:用数组实现的队列

链式队列:用链表实现的队列

  • 时间复杂度

1、顺序队列的python代码实现

首先说一下顺序队列的实现过程。与栈只需要一个栈顶指针不同,队列需要两个指针一个指向队头,一个指向队尾。

在入队和出队操作之后,指针的位置就会后移,因数组的长度限制,当队尾指向数组尾部下标的时候无法后移。如果出队一次进行一次数据迁移就不会有这种问题,但是时间复杂度就会由O1)变为O(n)。所以解决办法就是当没有空闲时间之后,才进行一次大的数据迁移。

 

如图:红色为队头蓝色为队尾。如果每操作一次出队,就进行一次数据迁移,那么时间复杂度就会变为O(n),如果无法插入时再进行数据前移,那么出队的时间复杂度仍然是O(1)。入队的时间复杂度就会由O(1),变为n-1O(1)加上一次O(n)。均摊时间复杂度就是O(1).

python没有数组,有列表,列表是由对其它对象的引用组成的连续数组。指向这个数组的指针及其长度被保存在一个列表头结构中。这就意味着每次进行增删操作都需要对数组的大小进行重新分配。这样的结构在对列表进行操作时的时间复杂度会很高。为了避免这种情况,这里要引入分配槽的概念,分配槽的大小不等同于列表大小,分配槽大小是指在内存中已经分配了的槽空间数。这样能避免每次列表添加数据都调用分配函数,这样均摊的时间复杂度就会比较低。增长模式为:04816253546587288……。所以python实现队列并对队列进行操作时,与正常数组实现的队列不大一样(因为我的开发语言是python所以有时会对python一些特性进行分析)

python列表的特性,进行删除操作时的时间复杂度为O(N).所以在进行出队时不要进行删除操作。留到数据迁移时同时进行

  • 代码实现
  1. 顺序队列
class queues:

    def __init__(self):

        self.items = []

        self._len = None

        self._head = 0

        self._taile = 0

    def _pop(self):

        if self.items:

            re_data = self.items[self._head]

            self._head = self._head + 1

            if self._head == 10:

                self._kuorong()

            return re_data

        else:

            return None

    def _push(self,data):

        self._taile = self._taile + 1

        self.items.append(data)

    def _kuorong(self):

        self.items = self.items[self._head:self._taile]

        self._head = 0

        self._taile = len(self.items)

 

     2.链式队列

class Node(object):

    def __init__(self,data,next=None):

        self.data = data

        self.next = next

class equeue:

    def __init__(self):

        self.headnode = Node(None)

        self.rear = None

    def _push(self,data):

        NewNode = Node(data)

        if not self.rear:

            self.headnode.next = NewNode

            self.rear = NewNode

        else:

            self.rear.next = NewNode

            self.rear = NewNode

    def _pop(self):

        result = self.headnode.next

        if self.headnode.next:

            self.headnode.next = self.headnode.next.next

        else:

            return None

        return result.data

 

     3.循环队列

class queues:

    def __init__(self):

        self.items = [None]*10

        self._len = None

        self._head = 0

        self._taile = 0

    def _pop(self):

        if self.items[self._head] != None:

            print(self.items[self._head])

            re_data = self.items[self._head]

            self.items[self._head] = None

            self._head = self._head + 1

            if self._head == 10:

                self._head = 0

            return re_data

        return None

    def _push(self,data):

        #print(self._taile,self.items[self._taile])

        if self.items[self._taile] == None:

            self.items[self._taile] = data

            self._taile = self._taile + 1

            if self._taile == 10:

                self._taile = 0

        else:

            #print("队满")

            pass

代码是自己编的,都能实现功能。如果发现问题或有更优化的代码请评论!!!

本文由博主学习总结而来,如果有错误的地方请指正。有多处借鉴!借鉴于

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5OTIyMjQxMA==&scene=124#wechat_redirect

https://time.geekbang.org/column/article/40961

万分感谢马老师和王争大佬的知识分享!

猜你喜欢

转载自blog.csdn.net/bquau/article/details/88894944