Datawhale第九期组队学习--数据结构与算法(上)Task03:栈与递归(2天)

理论部分
  • 用数组实现一个顺序栈。
  • 用链表实现一个链栈。
  • 理解递归的原理。

栈:

  1. 定义
    栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。栈又称为后进先出(Last In First Out,LIFO)的线性表。
    在栈中进行插入和删除操作的一端称为栈顶(Top),相应地,另一端称为栈底(Bottom)。不含数据元素的栈称为空栈。

  2. 存储结构

  • 顺序结构。采用顺序存储结构的栈称为顺序栈。栈空间的容量是有限的,需要预先定义(或申请)栈的存储空间。因此,在顺序栈中,当一个元素入栈时,需要判断是否满栈(栈空间中有没有空闲单元),若栈满,则元素不能入栈。
  1. 应用
    栈的典型应用包括表达式求值、括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈又非常重要的作用。
    怎么理解栈的应用?有哪些实例?
练习部分
  1. 根据要求完成车辆重排的程序代码

假设一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1至n,货运列车按照第n站至第1站的次序经过这些车站。车厢的编号与它们的目的地相同。为了便于从列车上卸掉相应的车厢,必须重新排列车厢,使各车厢从前至后按编号1至n的次序排列。当所有的车厢都按照这种次序排列时,在每个车站只需卸掉最后一节车厢即可。

我们在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨、一个出轨和k个缓冲铁轨(位于入轨和出轨之间)。图(a)给出一个转轨站,其中有k个(k=3)缓冲铁轨H1,H2 和H3。开始时,n节车厢的货车从入轨处进入转轨站,转轨结束时各车厢从右到左按照编号1至n的次序离开转轨站(通过出轨处)。在图(a)中,n=9,车厢从后至前的初始次序为5,8,1,7,4,2,9,6,3。图(b)给出了按所要求的次序重新排列后的结果。

具有三个缓冲区铁轨的转轨站

编写算法实现火车车厢的重排,模拟具有n节车厢的火车“入轨”和“出轨”过程。车辆重排
实思路过程如图:车辆重排栈图示
代码问题:
1、如果缓冲铁轨不够的话,应该在哪提示?
2、结果打印最后多一个None,不知道哪里的?

# cars: 等待排序的车厢 k: 缓冲轨数量,
def railroad(cars, k):
    cacheLists = []
    for i in range(k):
        cacheLists.append([])
    init = 1
    for i in cars:
        if i == init:
            print('{}号车厢入轨->出轨'.format(i))
            init += 1
            continue
        else:
            for list_item in cacheLists:
                if not list_item:
                    list_item.append(i)
                    break
                else:
                    if min(list_item) > i:
                        list_item.append(i)
                        break

    for item in cacheLists:
        for i in range(len(item)):
            last = item.pop()
            if last == init:
                print('{}号车厢入轨->出轨'.format(last))
                init += 1


car = [5, 8, 1, 7, 4, 2, 9, 6, 3]
n = 3
print(railroad(car, n))

打印结果:

1号车厢入轨->出轨
2号车厢入轨->出轨
3号车厢入轨->出轨
4号车厢入轨->出轨
5号车厢入轨->出轨
6号车厢入轨->出轨
7号车厢入轨->出轨
8号车厢入轨->出轨
9号车厢入轨->出轨
None
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sapphire~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值