队列

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

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

  • 排队买火车票
  • 打印机打印文件
  • 商店排队买东西的顾客
队列_第1张图片
解密QQ号.png

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


队列_第2张图片
列表指针示意图.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
队列_第3张图片
运行结果.png

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


队列_第4张图片
双端队列的方法及其描述.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))
队列_第5张图片
运行结果.png

你可能感兴趣的:(队列)