Python数据结构-栈的定义和特点——第二节内容总结

引子:

一、什么是链表?

1、链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,有一系列结点(地址)组成,结点可动态的生成。

2、结点包括两个部分:(1)存储数据元素的数据域(内存空间),(2)存储指向下一个结点地址的指针域。

3、相对于线性表顺序结构,操作复杂。

4.链表分为 (1)单链表 (2)双链表 (3)单向循环链表 (4)双向循环链表

1.链表和数组一样,也是一种线性表

二、链表的作用

1、实现数据元素的存储按一定顺序储存,允许在任意位置插入和删除结点。

2、包括单向结点,双向结点,循环接点

三、链表与数组的区别

说到链表那肯定要聊一下数组,为什么会出现链表呢?

(1)数组:使用一块连续的内存空间地址去存放数据,但

例如:
int  a[5]={1,2,3,4,5}。突然我想继续加两个数据进去,但是已经定义好的数组不能往后加,只能通过定义新的数组

int b[7]={1,2,3,4,5,6,7};      ***********这样就相当不方便比较浪费内存资源,对数据的增删不好操作。

(2)链表:使用多个不连续的内存空间去存储数据, 可以 节省内存资源(只有需要存储数据时,才去划分新的空间),对数据的增删比较方便。

正式学习重点内容:

栈与递归的爱恨情仇:

感悟:

通俗讲:

就是

从前有座山,山里有个庙,庙里有个小和尚,他在念:

从前有座山,山里有个庙,庙里有个小和尚,他在念:

从前有座山,山里有个庙,庙里有个小和尚,他在念:

从前有座山,山里有个庙,庙里有个小和尚,他在念:

从前有座山,山里有个庙,庙里有个小和尚......

再通俗讲:

就是简单的套娃问题

递归定义:

使用到递归场景:

递归在数学中的表述:

具有递归特性的数据结构:

举例如下:

拓展:

什么是广义表:

广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制容许它们具有其自身结构(即可以有子表)。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表

前面讲过,数组即可以存储不可再分的数据元素(如数字 5、字符 'a'),也可以继续存储数组(即 n 维数组)。

但需要注意的是,以上两种数据存储形式绝不会出现在同一个数组中。例如,我们可以创建一个整形数组去存储 {1,2,3},我们也可以创建一个二维整形数组去存储 {{1,2,3},{4,5,6}},但数组不适合用来存储类似 {1,{1,2,3}} 这样的数据。

有人可能会说,创建一个二维数组来存储{1,{1,2,3}}。在存储上确实可以实现,但无疑会造成存储空间的浪费。

对于存储 {1,{1,2,3}} 这样的数据,更适合用广义表结构来存储。

广义表,又称列表,也是一种线性存储结构。同数组类似,广义表中既可以存储不可再分的元素,也可以存储广义表,记作:

LS = (a1,a2,…,an)

其中,LS 代表广义表的名称,an 表示广义表存储的数据。广义表中每个 ai 既可以代表单个元素,也可以代表另一个广义表。

用分治法求解递归问

题:

一般形式(相当于套用模版):

求解n!的阶乘的六种方法

引子:

啥是阶乘?

自然数n!(n的阶乘)是指从1、2……(n-1)、n这n个数的连乘积,即
n!=n×(n-1)×……2×1

如:
1! = 1 =1
2!= 2 * 1 = 2
3!= 3 * 2 * 1 = 6
4! = 4 * 3 * 2 * 1 = 24
5!= 5 * 4 * 3 * 2 * 1 = 120

...

接下来,我们用四种学过的方法实现阶乘:

1、普通的for循环遍历:

 #函数实现
 def fact(num):
    a=1
    #for循环遍历
    for i in range(1,num+1):
         a*=i
    return a

 n = int(input())
 print(fact(n))

运行结果:

5
120

2、while循环

#输入n的值
n=int(input())            
product=n
i=1
if n ==0:
    print(1)
else:
	#while循环
    while i <n:                                              
        ans=ans*i                                            
        i=i+1                                               
    print(product)
# product英文有乘积的意思        
 
# 结果:
6
720

3、递归写法一

#函数实现
def fact(n):
    if n==0:
        return 1
    else:
        #递归调用
        return fact(n-1)*n
    
n = int(input())
print(fact(n))

#  结果
5
120

写法二:

#函数实现
def factorial(n):
      #三元运算表达式
      return 1 if n < 2 else n * factorial(n - 1)
 
#输入n的值
n = int(input())
print(factorial(n))

# 输出
5
120

思维图纸:

练习:

汉诺塔问题:

接下来介绍的就是印度阿三哥著名的汉诺塔问题啦:

Python代码实现:

# 这里使用的花括号是英文版的,就是可以运行没问题
"""汉诺塔问题"""
m = 0


def move(A, n, C):
    global m
    m += 1
    print("第{0}步,将编号为{1}的圆盘,从第{2}个柱子移动到第{3}个柱子上".format(m, n, A, C))
    
    # 中文版的{}和{}英文版的,看着一样 ,但是运行就是不一样
    # 真心建议:以后每次打代码是一定要看看自己用的输入法是不是英文

def hanoi(n, A, B, C):
    if n == 1:
        move(A, 1, C)
    else:
        hanoi(n - 1, A, C, B)
        move(A, n, C)
        hanoi(n - 1, B, A, C)


if __name__ == "__main__":
    n = int(input("请设置第一个柱子上的盘子数量:"))
    a, b, c = '1', '2', '3'
    print('第一根柱子上的圆盘数量为:', n)
    print('将第一根柱子上的圆盘全部移到第三根柱子上的过程为:')
    hanoi(n, a, b, c)
    print(m)

"""汉诺塔问题"""
m = 0

#这是中文版的花括号代码
# 就是运行时结果有问题

def move(A, n, C):
    global m
    m += 1
    print("第{0}步,将编号为{1}的圆盘,从第{2}个柱子移动到第{3}个柱子上".format(m, n, A, C))

    # 中文版的{}和{}英文版的,看着一样 ,但是运行就是不一样

def hanoi(n, A, B, C):
    if n == 1:
        move(A, 1, C)
    else:
        hanoi(n - 1, A, C, B)
        move(A, n, C)
        hanoi(n - 1, B, A, C)


if __name__ == "__main__":
    n = int(input("请设置第一个柱子上的盘子数量:"))
    a, b, c = '1', '2', '3'
    print('第一根柱子上的圆盘数量为:', n)
    print('将第一根柱子上的圆盘全部移到第三根柱子上的过程为:')
    hanoi(n, a, b, c)
    print(m)

规则:

递归算法的效率分析:

效率计算原理图:

从上述我们不难发现:

递归求解的优缺点:

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该压缩包是最新的python教程,里面包含基本的python用法以及简单的项目实例,高清PDF以及配套书籍代码,欢迎大家下载学习! 第一章,数字,字符串,和元组,将会看到不同类型的数字,工作 使用字符串,使用元组,并在Python中使用必不可少的内置类型。 我们也会利用 Unicode字符集合的全部功能。 第2章,语句和语法,将介绍创建脚本文件的一些基础知识。 然后 我们将继续看一些复杂的陈述,包括,如果,尝试, 和提高。 第3章,函数定义,将研究许多函数定义技术。 我们还会看一下python3.5类型模块看看我们如何创建更正式的 对我们的函数的注解。 第4章,内置的数据结构——列表,设置,阻止,将会查看各种各样的概述 可用的结构和它们解决的问题。 从这里,我们可以看列表, 字典,并详细地设置,并查看一些与如何处理的更高级的主题 Python处理对对象的引用。 第5章,用户输入和输出,将解释如何使用不同的特性 print()函数。 我们还将研究用于提供用户输入的不同功能。 第6章,类和对象的基础知识,将创建实现若干个 统计公式。 第7章,更高级的类设计,将更深入地深入到Python类中。 我们将结合我们之前学到的一些特性来创建更多的功能 复杂的对象。 第8章,功能和反应性编程特性,为我们提供了 编写小的、表达性的函数来执行所需的数据转换。 移动 在前面,你将学习反应式编程的概念,也就是,进行处理 当输入变得可用或更改时,将被评估的规则。 第9章,输入/输出,物理格式,逻辑布局,将使用不同的文件 像JSON、XML和HTML这样的格式。 第10章,统计规划和线性回归,将研究一些基本的统计数据 我们可以使用Python的内置库和数据结构进行计算。 我们来看看 相关的问题,随机性,和零假设。 第11章,测试,将为我们提供不同测试框架的详细描述 在Python中使用。 第12章,Web服务,将查看许多创建RESTful Web服务的菜谱 还提供静态或动态内容。 第13章,应用程序集成,将研究我们可以设计应用程序的方法 可以组合成更大、更复杂的复合应用程序。 我们也会看看复合应用程序可能产生的复杂性,以及需要 集中一些特性,比如命令行解析。
### 回答1: 列表是Python中最常用的数据类型之一,它可以存储多个元素,这些元素可以是不同的数据类型,如整数、浮点数、字符串等。列表使用方括号 [] 来表示,元素之间用逗号隔开。 例如,下面是一个包含整数、浮点数和字符串的列表: ``` my_list = [1, 2.5, "hello"] ``` 列表中的元素可以通过索引访问,索引从开始,例如: ``` print(my_list[]) # 输出 1 print(my_list[2]) # 输出 "hello" ``` 列表还支持切片操作,可以通过切片获取列表的子集,例如: ``` print(my_list[1:]) # 输出 [2.5, "hello"] ``` 列表是可变的,可以通过索引或切片修改列表中的元素,也可以使用 append() 方法向列表末尾添加新元素,例如: ``` my_list[] = 3 my_list.append("world") print(my_list) # 输出 [3, 2.5, "hello", "world"] ``` 除了 append() 方法,列表还支持 insert()、remove()、pop() 等方法,可以对列表进行增删改查操作。 ### 回答2: Python中的列表是一种非常常用的数据结构,是一组有序的元素集合,可以通过索引来访问其中的元素。列表可以包含多种类型的数据,包括数字、字符串、列表等等,且可以根据需要动态地添加、删除、修改其中的元素。在Python中,列表的创建方式非常简单,只需要用一组方括号将其中的元素括起来即可。 可以使用列表的索引来获取其中的元素。在Python中,列表的索引从0开始,即第一个元素的索引为0,第二个元素的索引为1,以此类推。要访问列表中的最后一个元素,可以使用-1作为索引,-2表示倒数第二个元素,依此类推。 列表元素的访问、添加、删除、修改、排序等操作属于Python基础知识,这里简单介绍其中几个: 1.访问列表元素:可以使用索引号来访问列表元素。例如,list=[1,2,3],要访问第一个元素,可以使用list[0],输出为1。 2.添加元素:可以使用append()方法向列表中添加一个元素,或者使用extend()方法向列表中添加多个元素。例如,list=[1,2,3],要添加一个元素4,可以使用list.append(4);要添加多个元素5,6,7,可以使用list.extend([5,6,7])。 3.删除元素:可以使用del语句或者remove()方法来删除列表中的元素。del语句直接删除列表中指定索引的元素,例如,del list[0]可以删除列表的第一个元素;remove()方法删除第一个匹配的元素,例如,list.remove(2)可以删除列表中的元素2。 4.修改元素:可以使用索引号来修改列表中的元素,例如,list[1]=5可以将列表中第二个元素修改为5。 5.排序:可以使用sort()方法对列表进行排序,默认是升序排列,也可以指定reverse=True来进行降序排列。 以上是Python列表的基本操作,熟练掌握这些操作,可以更好地使用列表进行各种计算和数据处理。 ### 回答3: 在Python中,列表(List)是一种非常常用的数据类型,它允许我们将一组数据放在一个容器中,方便进行操作和处理。列表可以在定义时直接初始化,也可以通过append()、insert()等方法动态地添加或删除元素。 列表的索引从0开始,可以通过正、负整数来访问其中的元素。同时,列表支持切片操作,可以对其中的子序列进行访问和操作。 除了常规的访问和添加操作,列表还提供了一些其他的方法,例如sort()可以对列表进行排序,reverse()可以将列表翻转,count()可以统计某个元素的出现次数等等。 另外,列表还支持循环遍历,可以使用for-in语句来遍历其中的元素。此外,列表也可以被用作其他数据结构的实现,例如、队列等等。 总的来说,列表是Python中一个非常灵活和强大的数据类型,可以用于各种场景下的数据处理和操作。但是需要注意,由于列表是可变的,因此在多线程、多进程等并发环境中需要考虑线程安全的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值