python特殊循环队列_队中元素个数代替队尾指针

.......................................................................................................................................................... 

  对于循环队列来说,如果知道队头指针和队中元素个数,则可以计算出队尾指针。也就是说,可以用队中元素个数代替队尾指针。设计出这种循环队列的判队空、进队、出队和取队头元素的算法。

.......................................................................................................................................................... 

.......................................................................................................................................................... 
        本例的循环队列包含data 数组、队头指针 front和队中元素个数count,可以由front 和count求出队尾位置,公式如下。

rear1=(self.front+self.count)% MaxSize

.......................................................................................................................................................... 
        初始时front和count均置为0。队空条件为count==0;队满条件为count==MaxSize;元素e进队操作是先根据上述公式求出队尾指针rearl,将rear1循环增1,然后将元素e放置在rearl处;出队操作是先将队头指针循环增1,然后取出该位置的元素。设计本例的循环队列类CSqQueuel如下:

.......................................................................................................................................................... 

#rear=(self.front+self.count)%MaxSize
#队空:count==0
#队满:count==Maxsize
MaxSize = 5
class CircleQueue:  # 循环队列
    """这种循环队牛逼之处就是:中元素个数代替尾指针,队满不存在空值,可存Maxsize个元素"""
    def __init__(self):
        self.data = [None] * MaxSize  # 初始空间
        self.front = 0
        self.count = 0
    def push(self, e):  # 元素e进队
        rear=(self.front+self.count)%MaxSize #得到队尾指针
        assert self.count!=MaxSize # 判断队满
        rear=(rear+1)%MaxSize #和前面的循环队列一个道理
        self.data[rear] = e
        self.count+=1
    def is_empty(self):  # 判断队空
        return self.count == 0
    def pop(self):  # 元素出队
        assert not self.is_empty()  # 先判断是否为空
        self.count-=1
        self.front = (self.front + 1) % MaxSize
        return self.data[self.front]
    def gethead(self):  # 获取头元素
        assert not self.is_empty()
        return self.data[(self.front + 1) % MaxSize]
    def getsize(self):  # 获取队列长度,在front下标小于rear时,size可以直接用rear-front获取,但是如果边删边加,导致rear小于front,此方法出错
        rear = (self.front + self.count) % MaxSize
        return (rear - self.front + MaxSize) % MaxSize #该式满足上叙所有情况
    def dispaly(self):
        q=self.front
        if self.count != 0: #判断队空
            for i in range(self.getsize()):
                q = (q+1)%MaxSize #符合两种情况的式子
                print(self.data[q], end=",")
        else:
            return None
    def pushk(qu, k, e):
        n = qu.getsize()
        if k < 1 or k > n + 1:  #k必须正常
            return False
        if k <= n:
            for i in range(1, n + 1):  #边删边进
                if i == k:  #插个队,它插完,后面的再边删边进
                    qu.push(e)
                x = qu.pop()
                qu.push(x)
        e1se: qu.push(e)
        return True
    def popk(qu, k):
        n = qu.getsize()
        assert 1 <= k <= n
        for i in range(1, n + 1):  #和上面的思想一样
            x = qu.pop()
            if i != k:
                qu.push(x)
            else:
                e = x  # 取第k个出队的元素
        return e

if __name__=="__main__":
    hh = CircleQueue()
    # print(hh.is_empty())
    # hh.push(0)
    # hh.push(1)
    # hh.push(2)
    # hh.push(3)
    # print(hh.getsize())
    # hh.dispaly()
# True
# 4
# 0, 1, 2, 3,
# Process
# finished
# with exit code 0
# #当rear<front时
#     hh.push(3)
#     hh.push(4)
#     hh.push(5)
#     hh.push(6)
#     hh.pop()
#     hh.pop()
#     hh.pop()
#     hh.push(7)
#     hh.push(8)
#     print(hh.getsize())
#     hh.dispaly()
# 3
# 6,7,8,
# Process finished with exit code 0

.......................................................................................................................................................... 

Guff_hys_python数据结构,大数据开发学习,python实训项目-CSDN博客

 ..........................................................................................................................................................

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中可以使用列表来实现循环队列。具体实现方法是,定义一个固定大小的列表,使用两个指针front和rear分别指向头和尾。当列为空时,front和rear指向同一个位置。当列满时,rear指向的位置的下一个位置就是front。在插入元素时,将元素插入到rear指向的位置,然后将rear指针向后移动一位。在删除元素时,将front指向的元素删除,然后将front指针向后移动一位。需要注意的是,当rear指针指向列表的最后一个位置时,如果还要插入元素,需要将rear指针重新指向列表的第一个位置。 下面是一个简单的Python循环队列的实现代码: ``` class CircularQueue: def __init__(self, k: int): self.size = k self.queue = [None] * k self.front = 0 self.rear = 0 def enqueue(self, value: int) -> bool: if self.isFull(): return False self.queue[self.rear] = value self.rear = (self.rear + 1) % self.size return True def dequeue(self) -> bool: if self.isEmpty(): return False self.queue[self.front] = None self.front = (self.front + 1) % self.size return True def Front(self) -> int: if self.isEmpty(): return -1 return self.queue[self.front] def Rear(self) -> int: if self.isEmpty(): return -1 return self.queue[(self.rear - 1 + self.size) % self.size] def isEmpty(self) -> bool: return self.front == self.rear and self.queue[self.front] is None def isFull(self) -> bool: return self.front == self.rear and self.queue[self.front] is not None ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Guff_hys

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

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

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

打赏作者

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

抵扣说明:

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

余额充值