前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >可修改内容的优先级队列

可修改内容的优先级队列

作者头像
小锋学长生活大爆炸
发布2020-08-13 14:44:06
8750
发布2020-08-13 14:44:06
举报

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

需求

代码语言: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'}]
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档