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()
    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    打造基于CentOS7的xfce最简工作环境
    Linux下C程序的编辑,编译和运行以及调试
    修正 XE6 TListView 上方 SearchBok 右边的清除钮显示
    TabControl 显示彩色的图示 (XE6 Firemonkey)
    TSwitch 中文简繁显示支持(XE6 Android)
    改变 TMemo 的背景颜色 (Firemonkey)
    修正 XE5 Android 键盘三个问题
    Delphi 收藏
    展示 Popup 的使用方法
    ListView 下拉更新 (支持 Android)
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15327287.html
Copyright © 2011-2022 走看看