队列

2018-07-30  本文已影响3人  Amica

队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,我们称其为“出队”,而在队列的尾部(tail)进行插入操作,我们称之为“入队”。当队列中没有元素时(head==tail),我们称之为空队列。

生活中常见的符合队列特性的例子:

解密QQ号.png

我们尝试着用python的列表来解决上面的解密QQ号的问题。这里我通过将加密后的一串数存储到列表中,并设置两个指针,head和tail,示意图如下所示:


列表指针示意图.png

通过题目中描述的规则编写代码如下所示:

#coding=utf-8
"""
Created on Mon Jul 30 11:31:24 2018

@author: Amica
"""
def Decoder(nums):
    head=0
    tail=len(nums)
    #设置一个新的列表用于存储移除的队首元素
    new_nums=[]
    while(head<tail-1):
        new_nums.append(nums[head])
        print("队首元素:",nums[head])
        print(new_nums)
        #将指针向前移动即删除队首的元素
        head+=1
        
        #将指针指向的元素添加到列表的尾部
        nums.append(nums[head])
        #将队尾的指针向后移动一位
        tail+=1
        #将队首的指针向后移动
        head+=1
    print("队首元素:",nums[head])
    new_nums.append(nums[head])
    return new_nums
if __name__=="__main__":
    nums=[6,3,1,7,5,8,9,2,4]
    print(Decoder(nums))
运行结果.png

其实在Python中,我们可以使用collections模块下的deque函数,它提供了队列所有的接口,collections.deque是双端队列,也就是说在队列的左右两边都是既可以进又可以出的。


双端队列的方法及其描述.png

下面我们通过collections提供的deque进行QQ号的解密:

# -*- coding: utf-8 -*-
"""
Created on Mon Jul 30 14:33:42 2018

@author: Amica
"""
from collections import deque
new_nums=[]
def Decoder(nums):
    #创建一个队列
    q=deque(nums)
    print(q)
    i=0
    while len(q)>1:
        #删除最左侧的元素并将删除的元素添加到列表new_nums中
        i+=1
        new_nums.append(q.popleft())
        print("经过第{}轮删除新列表中存在的元素{}".format(i,new_nums))
        #删除最左侧的元素并将删除的元素添加到队列的最右侧
        q.append(q.popleft())
    i+=1   
    new_nums.append(q.popleft())
    print("经过第{}轮删除新列表中存在的元素{}".format(i,new_nums))
    return new_nums
nums=[6,3,1,7,5,8,9,2,4]
print("小哈的QQ号为:",Decoder(nums))
运行结果.png
上一篇 下一篇

猜你喜欢

热点阅读