当前位置:首页 » 《随便一记》 » 正文

队列及其python实现_suwuzs的博客

16 人参与  2022年05月19日 17:40  分类 : 《随便一记》  评论

点击全文阅读


文章目录

  • 队列(Queue)
  • 队列的实现
  • 约瑟夫问题
  • 双端队列
    • 回文词的判定

队列(Queue)

队列(Queue)是一个有次序的数据集合;数据项仅添加到尾rear端,而且仅从首front端移除,Queue具有FIFO的操作次序。
在这里插入图片描述
队列支持的操作:

  • 入队(enqueue):增加一个新的元素
  • 出队(dequeue):删除一个元素
  • peek() :返回队首数据项
  • isEmpty() : 查看队列是否为空
  • size():返回队列中数据项的个数

队列的实现

数组(列表)实现:

class Queue(object):
    def __init__(self):
        self.items = []
    # 测试队列是否为空
    def isEmpty(self):
        return self.items == []
    # 将数据添加到队尾
    def enqueue(self, item):
        self.items.insert(0,item)
    # 从队首移除数据,队列被修改
    def dequeue(self):
        return self.items.pop()
    # 返回队首数据
    def peek(self):
        return self.items[len(self.items)-1]
    # 返回队列中数据项的个数
    def size(self):
        return len(self.items)
from ADT_CLASS import Queue

q = Queue()
print(q.isEmpty())
q.enqueue(1)
q.enqueue('dog')
q.enqueue('4')
print(q.size())
print(q.peek())
print(q.dequeue())
print(q.size())
输出:
队列是否为空: True
队列长度: 3
队首数据: 1
删除队首: 1
队列长度: 2

约瑟夫问题

在这里插入图片描述
这里我们模拟一圈人坐在一起玩逢num数过的游戏,最后留下的人是谁。
模拟游戏开始,只需要将队首的人出列,随即再加到队尾,过了num次后,将队首的人移除,不再入队。
如此反复,直到队中还剩下一人。

from ADT_CLASS import Queue

def josephProblem(namelist, num):
    q = Queue()
    for name in namelist:
        q.enqueue(name)
    while q.size() > 1:
        for i in range(num):
            q.enqueue(q.dequeue())
        q.dequeue()
    return q.dequeue()

namelist = ['a','b','c','d','e','f','g']
print(josephProblem(namelist,3))

双端队列

双端队列(Deque)是一种有次序的数据集;

  • 数据项既可以从队首加入,也可以从队尾加入;数据项也可以从两端移除。(某种意义上说,双端队列集成了栈和队列的功能);
  • 双端队列不具有 LIFO 或 FIFO 特性。
    在这里插入图片描述
    这里我们用collections 库里的deque来实现双端队列;
from collections import deque

d = deque()
print(d)

d = deque(['a','b','c'])
print(d)

d.append(1)#后端添加
d.appendleft(0)#前端添加
print(d)

d.extend((2,3))
print(d)

d.extendleft((-1,-2))
print(d)
#在索引3之前插入数字100
d.insert(3,100)
print(d)

a = d.pop()#后端弹出
print(a)
print(d)

a = d.popleft()#前端弹出
print(a)
print(d)
print(len(d))
#清除队列所有元素
d.clear()
print(d)
输出:
deque([])
deque(['a', 'b', 'c'])
deque([0, 'a', 'b', 'c', 1])
deque([0, 'a', 'b', 'c', 1, 2, 3])
deque([-2, -1, 0, 'a', 'b', 'c', 1, 2, 3])
deque([-2, -1, 0, 100, 'a', 'b', 'c', 1, 2, 3])
3
deque([-2, -1, 0, 100, 'a', 'b', 'c', 1, 2])
-2
deque([-1, 0, 100, 'a', 'b', 'c', 1, 2])
8
deque([])

回文词的判定

LeetCode 125. 验证回文串
在这里插入图片描述

from collections import deque
def isPalindrome(s):
    d = deque()
    for ch in s:
        d.append(ch)
    # for ch in s:
    #     if ch.isalnum():
    #         d.appendleft(ch.lower())
    res = True
    while len(d) > 1 and res:
        first = d.pop()
        last = d.popleft()
        if first != last:
            res = False
    return res

print(isPalindrome('abccba'))
print(isPalindrome('raceacar'))
输出:
True
False

点击全文阅读


本文链接:http://zhangshiyu.com/post/40481.html

队列  数据项  的人  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1