可修改内容的优先级队列

2020-08-13 14:44:06 浏览数 (1)

题外话:震惊,之前账号一直登不上,还以为被封了呢,错过了小伙伴的私信

需求

代码语言:javascript复制
• 以优先级入队,即入队前要求队列已排序,从而确定当前优先级所在位置。同优先级按先后次序入队。
• 可由管理员对队列内容进行修改,修改时应暂时锁住队列。
• 以优先级出队,同优先级按当前位置(即入队顺序)出队(若已排序,则可直接出队操作而不需再判断)。
• 采用数组存字典的形式,模拟队列 {"pri":0, "msg":"txt"}
• 功能
 a. 增
 可插入数据(单个或全部)
 b. 删
 可删除指定 优先级 的数据(单个或全部)
 c. 改
 可修改指定 优先级和内容 的数据(单个)
 d. 查
 可查询指定 优先级 的数据(单个或全部)

代码

代码语言:javascript复制
# coding:utf-8

'''
    • 以优先级入队,即入队前要求队列已排序,从而确定当前优先级所在位置。同优先级按先后次序入队。
    • 可由管理员对队列内容进行修改,修改时应暂时锁住队列。
    • 以优先级出队,同优先级按当前位置(即入队顺序)出队(若已排序,则可直接出队操作而不需再判断)。
    • 采用数组存字典的形式,模拟队列 {"pri":0, "msg":"txt"}
    • 功能
        a. 增
        可插入数据(单个或全部)
        b. 删
        可删除指定 优先级 的数据(单个或全部)
        c. 改
        可修改指定 优先级和内容 的数据(单个)
        d. 查
        可查询指定 优先级 的数据(单个或全部)
'''
class enhanceQueue:
    def __init__(self):
        self.queue = []
        self.length = 0
        self.unlock = True

    # 批量插入数据,其中 arr -> [(pri, 'msg'), (pri, 'msg'), (pri, 'msg')]
    def Create(self, arr):
        self.queue.clear()
        for item in arr:
            priority = item[0]
            value = item[1]
            self.Push(priority, value)
        return self.queue

    # 插入单个数据
    def Push(self, priority, value):
        content = {"pri": priority, "msg": value}
        if self.unlock:
            self.unlock = False
            if self.queue:
                for i in range(len(self.queue)):
                    if self.queue[i]['pri'] > priority:
                        self.queue.insert(i, content)
                        self.length  = 1
                        break
                    elif i 1 == len(self.queue):
                        self.queue.append(content)
                        self.length  = 1
                        break
                    elif self.queue[i]['pri'] <= priority:
                        continue
                self.unlock = True
            else:
                self.queue.append(content)
                self.length  = 1
                self.unlock = True

    # 出队操作,以优先级出队,同优先级按当前位置(即入队顺序)出队
    def Pop(self):
        if self.queue and self.unlock:
            self.unlock = False
            self.length -= 1
            pop = self.queue.pop(0)
            self.unlock = True
            return pop
        else:
            return None

    # 删除指定 优先级 的数据(其中,isall表示单个或全部同优先级)
    def Delete(self, priority, isall=False):
        if self.queue and self.unlock:
            self.unlock = False
            temp = []
            for item in self.queue:
                if item['pri'] == priority:
                    temp.append(item)
                    if isall:
                        continue
                    else:
                        break
            for i in temp:
                self.queue.remove(i)
                self.length -= 1
            self.unlock = True

    # 查找指定 优先级 的数据(其中,isall表示单个或全部同优先级)
    def Search(self, priority, isall=False):
        temp = []
        if self.queue and self.unlock:
            self.unlock = False
            for item in self.queue:
                if item['pri'] == priority:
                    temp.append(item)
                    if isall:
                        continue
                    else:
                        break
            self.unlock = True
        return temp

    # 修改指定 优先级和内容 的数据
    def Modify(self, priority, oldvalue, newValue):
        if self.queue and self.unlock:
            self.unlock = False
            for item in self.queue:
                if item['pri'] == priority and item['msg'] == oldvalue:
                    item['msg'] = newValue
                    self.unlock = True
                    return True
            self.unlock = True
        return False

    # 打印当前队列,也可直接调用 obj.queue查看
    def Display(self):
        for i in self.queue:
            print(i)

    # 查询是否是锁定状态
    def IsLock(self):
        return self.unlock

    # 清空整个队列
    def ClearAll(self):
        if self.unlock:
            self.unlock = False
            self.queue.clear()
            self.unlock = True


def test():
    queue = enhanceQueue()
    print('*' * 40)
    print(">> 批量创建队列")
    print("输入的数据: [(3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')]")
    queue.Create([(3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')])
    print("输出的数据: ", queue.queue)

    print('*' * 40)
    print(">> 清空整个队列")
    queue.ClearAll()
    print("输出的数据: ", queue.queue)

    print('*' * 40)
    print(">> 单个输入数据")
    print("输入的数据: (3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')")
    queue.Push(3, 'a')
    queue.Push(1, 'b')
    queue.Push(5, 'c')
    queue.Push(2, 'd')
    queue.Push(7, 'e')
    queue.Push(5, 'f')
    print("输出的数据: ", queue.queue)

    print('*' * 40)
    print(">> 出队一个数据")
    queue.Pop()
    print("剩余的数据: ", queue.queue)

    print('*' * 40)
    print(">> 搜索指定优先级的单个数据, 如5")
    print("剩余的数据: ", queue.Search(5))

    print('*' * 40)
    print(">> 搜索指定优先级的全部数据, 如5")
    print("剩余的数据: ", queue.Search(5, True))

    print('*' * 40)
    print(">> 修改指定 优先级和内容 的数据, 如5,c->5,o")
    queue.Modify(5, 'c', 'o')
    print("修改后的数据: ", queue.Search(5))

    print('*' * 40)
    print(">> 删除指定优先级的单个数据, 如2")
    queue.Delete(5)
    print("删除后的数据: ", queue.queue)

    print('*' * 40)
    print(">> 删除指定优先级的全部数据, 如5")
    queue.Delete(5, True)
    print("删除后的数据: ", queue.queue)

if __name__ == '__main__':
    test()




****************************************
>> 批量创建队列
输入的数据: [(3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')]
输出的数据:  [{'pri': 1, 'msg': 'b'}, {'pri': 2, 'msg': 'c'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'c'}, {'pri': 7, 'msg': 'c'}]
****************************************
>> 清空整个队列
输出的数据:  []
****************************************
>> 单个输入数据
输入的数据: (3, 'a'), (1, 'b'), (5, 'c'), (2, 'c'), (7, 'c'), (5, 'c')
输出的数据:  [{'pri': 1, 'msg': 'b'}, {'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'f'}, {'pri': 7, 'msg': 'e'}]
****************************************
>> 出队一个数据
剩余的数据:  [{'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'f'}, {'pri': 7, 'msg': 'e'}]
****************************************
>> 搜索指定优先级的单个数据, 如5
剩余的数据:  [{'pri': 5, 'msg': 'c'}]
****************************************
>> 搜索指定优先级的全部数据, 如5
剩余的数据:  [{'pri': 5, 'msg': 'c'}, {'pri': 5, 'msg': 'f'}]
****************************************
>> 修改指定 优先级和内容 的数据, 如5,c->5,o
修改后的数据:  [{'pri': 5, 'msg': 'o'}]
****************************************
>> 删除指定优先级的单个数据, 如2
删除后的数据:  [{'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 5, 'msg': 'f'}, {'pri': 7, 'msg': 'e'}]
****************************************
>> 删除指定优先级的全部数据, 如5
删除后的数据:  [{'pri': 2, 'msg': 'd'}, {'pri': 3, 'msg': 'a'}, {'pri': 7, 'msg': 'e'}]

0 人点赞