第五章 数据结构一(5.1向量(链表),5.2(队列))

数据结构

向量和队列

这一块其实在python的数据结构当中我们都可以使用基础的数据结构List进行代替。以下我们将用列表的一些基础函数还原丛书中所提到的几种特殊的数据结构。

向量

  1. 状态----对应
a=[1,13141,141,14]
len(a)#此处的len返回值是长度
  1. 尾部添加
a:list
a.append(b)#末尾添加
a.pop(b=-1)#弹出,默认是末尾
a.insert(b)#插入,指定位置
a.remove(b)#删除而非弹出,无返回值
  1. 迭代器

所谓迭代器其实就是可以直接使用for循环在列表中进行替代,这里介绍两种常用的循环遍历的方式

a:list
#每一个i既是对应a中的元素
for i in a:
	print(i)
#每一个num是对应的位数,i既是对应a中的元素
for num,i in enumerate(a):
	print(num,i)
向量应用

例题5.1 完数与盈数
在这里分享一下我的辣鸡代码,其中我将我的错误列出来,自我提醒

#很常见的求和代码,但是其实python本身应该有求和代码就是sum,所以不用和书上一样去实现
def sum(a:list):
    rsum=0
    for i in a:
        rsum+=i
    return rsum
#很常见的求因式分解的代码,连续取余法
def SolveY(Num):
    rlist=[]
    for i in range(1,Num):
        if(Num%i==0):
            rlist.append(i)
    return rlist
#既是直接创建列表即可    
Ylist=[]
Wlist=[]
#一定一定要注意题目中要求的边界范围,自己在机试的时候也一定要注意,不能在简单题上面大意失荆州。
for obj in range(2,61):
    countlist=SolveY(obj)
    result=sum(countlist)
    if result>obj:
        Ylist.append(obj)
    elif result==obj:
        Wlist.append(result)
#这里是python在输出的时候的一个坑,python的输出是自动带换行的,所以要是想达成题目要求的输出就必须采用以下格式
print("E: ",end="")
for i in Wlist:
    print(i,end="")
    print(" ",end="")
print("\n",end="")
print("G: ",end="")
for a in Ylist:
    print(a,end="")
    print(" ",end="")

队列

队列是一个线性的有序列的数据结构,整体结构就一句话,FIFO先进先出,后进后出,我们在整体的实现过程中也是使用列表对其进行基础 的代替。
函数就是列表的函数,我们直接看应用。

队列的应用

例题5.2 约瑟夫问题NO.2

这个题目我也不知道我到底用没用队列,但是这种循环队列的思想是必须要有的,就是解决围圈问题的,这种n个小孩围成一圈,就应该使用这种循环队列的形式,我这边实现循环队列的方法,主要还是从循环入手mm并无像书中所提到的使用重新构造队列的方法

n=int(input())
p=int(input())
m=int(input())

children=[];result=[]
for i in range(1,n+1):
    children.append(i)

num=p;counter=1
while len(children):
    num+=1;counter+=1
    if(num>len(children)):num=1
    if(counter==m):
        result.append(children.pop(num-1))
        counter=1
    
print(result)

例题5.3猫狗收容所

#encoding "utf-8"
#encoding "utf-8"
n=int(input("输入操作序列次数"))
cat=[];dog=[];result=[]
counter=0
Torder=[[1,1],[1,-1],[2,0],[1,2],[2,-1],[2,1]]
while n:
    # order=int(input())
    # animal=int(input())
    order=Torder[-n][0]
    animal=Torder[-n][1]
    n-=1#把操作提前一点放到分支之前,避免莫名其妙的跳出影响计数
    counter+=1
    if(order==1):
        if(animal>0):
            dog.append([animal,counter])
        if(animal<0):
            cat.append([animal,counter])
        else:
            continue
    if(order==2):
        if(animal==0):
            if(dog[0][-1]<(cat[0][-1])):
                result.append(dog.pop(0))
            else:
                result.append(cat.pop(0))
        if(animal==1):
            result.append(dog.pop(0))
        if(animal==-1):
            result.append(cat.pop(0))
for i in result:
    print(i[0],end=" ")    

这道题的核心就是就是一定要把猫狗分为两个队列,然后使用一个双标志位确认的方式,保存一下存入的顺序,然后注意次序比较的大小于号,就能完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值