zoukankan      html  css  js  c++  java
  • 循环队列维持队列容量的恒定

    队列的进入是从队尾进入,出去是从对头出去,但从对头出去了,若这个队列的容量是恒定的,那么他又该如何进入呢
    还是从队尾进入,但这时候队尾指针就回到了数组的首位,当有元素入队时将其放入数组的首位,队尾指针继续向后移。
    队列已经慢的条件:
    (队尾下标+1)%数组长度 = 对头下标
    上面的意思就是正常来说对头索引就是0,若是循环队列,则对头位置为队尾索引+1
    这里的缘由是取模运算中后者比前者大,模就是前者,整除的话就为0
    取模运算的概念:
    '''
    a=b//c
    d = b-c*a等价于d = b%c
    取模运算在负数进行除法运算时不同;向负无穷方向舍入(floor()函数)
    求模运算和求余运算在第一步不同,取余运算在取c的值时,
    向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。
    在负数除法运算中,取余运算得到的值较大,而取模运算得到的值较小;例如-2.7
    取余:-2.0;取模:-3.0;而对于正数两者相同
    '''

    class MyQueue:
        def __init__(self, capacity):
            '''
            self.front表示对头
            self.rear表示队尾
            要明白为什么变量+1在做取模运算
            (队尾下标+1)%数组长度 = 对头下标,代表此队列满了
            队尾指针指出的位置永远空出1位,所以队列最大容量比数组长度小1
            '''
            self.list = [None] * capacity # capacity容量; 容积;
            self.front = 0
            self.rear = 0
        # 循环队列
        def enqueue(self, element):# 入队
            if (self.rear+1) % len(self.list) == self.front: # (队尾下标+1)%数组长度 = 对头下标
                # 上面的意思就是正常来说对头索引就是0,若是循环队列,则对头位置为队尾索引+1
                # 这里的缘由是取模运算中后者比前者大,模就是前者,整除的话就为0
                raise Exception("队列已满 !")
            self.list[self.rear] = element #从队尾入队
            self.rear = (self.rear+1) % len(self.list) # 取模运算
    
        def dequeue(self): # 出队
            if self.rear == self.front:
                raise Exception("队列为空 !")
            dequeue_element = self.list[self.front] #对头元素出队
            self.front = (self.front+1) % len(self.list) # # 取模运算
            return dequeue_element
    
        def output(self):
            i = self.front # i初始为对头
            while i != self.rear:
                print(self.list[i]) # 循环队列是从列表中读取数据
                # i一定会等于队尾,i的数值自增不可能比数列长度长
                i = (i+1) % len(self.list) # i随着队列的长度做取模运算
    
    # 这是原先已经有队列了
    myQueue = MyQueue(6)
    myQueue.enqueue(3)
    myQueue.enqueue(5)
    myQueue.enqueue(6)
    myQueue.dequeue()
    myQueue.dequeue()
    myQueue.enqueue(2)
    myQueue.enqueue(4)
    myQueue.output()
    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    【转载】Linux的进程间通信-信号量
    【转载】高性能数据库连接池的内幕
    【转载】我是一块硬盘(下)
    【转载】我是一块硬盘(上)
    69. Sqrt(x)
    68. Text Justification
    67. Add Binary
    66. Plus One
    65. Valid Number
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15327287.html
Copyright © 2011-2022 走看看