可修改內容的優先級隊列

 

題外話:震驚,之前賬號一直登不上,還以爲被封了呢,錯過了小夥伴的私信

 

需求

• 以優先級入隊,即入隊前要求隊列已排序,從而確定當前優先級所在位置。同優先級按先後次序入隊。
• 可由管理員對隊列內容進行修改,修改時應暫時鎖住隊列。
• 以優先級出隊,同優先級按當前位置(即入隊順序)出隊(若已排序,則可直接出隊操作而不需再判斷)。
• 採用數組存字典的形式,模擬隊列 {"pri":0, "msg":"txt"}
• 功能
 a. 增
 可插入數據(單個或全部)
 b. 刪
 可刪除指定 優先級 的數據(單個或全部)
 c. 改
 可修改指定 優先級和內容 的數據(單個)
 d. 查
 可查詢指定 優先級 的數據(單個或全部)

可修改內容的優先級隊列的實現

 

代碼

# 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'}]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章