鱼C论坛

 找回密码
 立即注册
查看: 1031|回复: 9

[已解决]关于栈的代码的疑问

[复制链接]
发表于 2020-6-18 17:11:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
定义一个栈(Stack)类,用于模拟一种具有后进先出(LIFO)特性的数据结构
class Stack:
    def __init__(self, start=[]):
        self.stack = []
        for x in start:
            self.push(x)

    def isEmpty(self):
        return not self.stack
    
    def push(self, obj):
        self.stack.append(obj)
 
    def pop(self):
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack.pop()
 
    def top(self):
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack[-1]
 

    def bottom(self):
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack[0]
1.在这个代码中的2~5行是一个初始化的过程,他先定义了一个空栈,然后又把start列表里面的内容穿进去?start在第二行方法后面的定义中不是已经定义start=【】空列表了吗?空列表怎么传到栈里面去啊
2.第八行的代码中有个return  not self.stack这个代码什么意思啊?返回的是什么?self.stack在第3行不是已经定义为一个栈了吗?
3.还有我想问一下第15行的print('警告')和第 17行的return self.stack.pop()这两个语句在显示和作用上有没有什么区别啊?这两个语句一直弄混,不知道什么情况下用print什么情况下用return能说明一下吗
最佳答案
2020-6-18 17:22:30
本帖最后由 Twilight6 于 2020-6-18 17:24 编辑


1.在这个代码中的2~5行是一个初始化的过程,他先定义了一个空栈,然后又把start列表里面的内容穿进去?start在第二行方法后面的定义中不是已经定义start=【】空列表了吗?空列表怎么传到栈里面去啊


start = [] 是设置了默认参数的值,而如果是空列表for 循环就不会执行,而如果你传入了你自己的列表 那么久将你这个列表逐个放入栈中

2.第八行的代码中有个return  not self.stack这个代码什么意思啊?返回的是什么?self.stack在第3行不是已经定义为一个栈了吗?

第八行就算调用看栈是否为空栈 , 因为 not [] 会返回 1 而如果 栈里面有元素就返回 0


3.还有我想问一下第15行的print('警告')和第 17行的return self.stack.pop()这两个语句在显示和作用上有没有什么区别啊?这两个语句一直弄混,不知道什么情况下用print什么情况下用return能说明一下吗

有区别,print 只是单纯的打印,没有返回值,也就是打印数值到屏幕上给我们看的,而return 是函数返回时候用的 , 只能在函数内用 ,没有print的就不会打印显示返回值

但是你在IDLE 或者其他编辑器的控制台会自动打印返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-18 17:15:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 17:22:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-18 17:24 编辑


1.在这个代码中的2~5行是一个初始化的过程,他先定义了一个空栈,然后又把start列表里面的内容穿进去?start在第二行方法后面的定义中不是已经定义start=【】空列表了吗?空列表怎么传到栈里面去啊


start = [] 是设置了默认参数的值,而如果是空列表for 循环就不会执行,而如果你传入了你自己的列表 那么久将你这个列表逐个放入栈中

2.第八行的代码中有个return  not self.stack这个代码什么意思啊?返回的是什么?self.stack在第3行不是已经定义为一个栈了吗?

第八行就算调用看栈是否为空栈 , 因为 not [] 会返回 1 而如果 栈里面有元素就返回 0


3.还有我想问一下第15行的print('警告')和第 17行的return self.stack.pop()这两个语句在显示和作用上有没有什么区别啊?这两个语句一直弄混,不知道什么情况下用print什么情况下用return能说明一下吗

有区别,print 只是单纯的打印,没有返回值,也就是打印数值到屏幕上给我们看的,而return 是函数返回时候用的 , 只能在函数内用 ,没有print的就不会打印显示返回值

但是你在IDLE 或者其他编辑器的控制台会自动打印返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 17:24:21 | 显示全部楼层
Twilight6 发表于 2020-6-18 17:22
start = [] 是设置了默认参数的值,而如果是空列表for 循环就不会执行,而如果你传入了你自己的列表  ...

每次你都是最快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 17:25:18 | 显示全部楼层

   加油把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 17:28:42 | 显示全部楼层

大佬是不是写了什么程序,自动获取最新求助贴,并弹窗提醒你!!??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 17:28:43 | 显示全部楼层
第一问:假如有传列表,start就不是空列表,对列表进行循环添加,如果们没有对空列表循环也不会报错

第二问:这返回一个bool值,非空的列表位真。假如self.stack有值,返回一个False.反之返回True

第三问:
    def pop(self):
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack.pop()

这函数,大致就是说,如果栈里面没有内容,就不要去pop(弹值因为会报错),如果有值再进行pop。

不知道什么情况下用print什么情况下用return能说明一下吗,这个问题不是很想说,这两个有本质的区别。

return是一个函数返回的标志
print 只是打印出来,两者有本质的区别,你都看到栈,类了,这两个应该要分清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-6-18 17:29:49 | 显示全部楼层
yhhpf 发表于 2020-6-18 17:28
大佬是不是写了什么程序,自动获取最新求助贴,并弹窗提醒你!!??

没呢   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 20:23:23 | 显示全部楼层
本帖最后由 1223253411 于 2020-6-18 20:51 编辑

第一问:栈      首先你要知道栈模型是什么,你也说了它是一个后进先出的模型对吧,但!!!它是一种逻辑结构!,什么是逻辑结构呢,它表示的是一种数据与数据之间的抽象的,描述着数据的存储方式与结构。
所以,不是空列表怎么传进去的,而是用列表做了一个栈!然后让列表来满足栈的使用,也就是为栈创建方法,在传参的时候如果传了一个列表就把传入的列表数据拿出放到栈中。

第二问:问一下,bool值为false的情况有哪些,空,零,不存在,对不对,那self.stack为空也就是当栈为空的时候,是不是就返回了false,not是不是就把false变为了true,也就是在栈为空时,返回一个true

第三问:你看,它是不是和第二问一样,在栈为空的也就时列表为空的情况下返回true,那样的话还能返回数据吗,没数据怎么返回数据,就给你打印一句咯,它也可以不打印,你是定义者,所有的东西你来决定,你不想让它打印就不让它打印,可以就让它返回一个None,反正只要提醒使用者栈为空无法提取数据就行,
那有数据怎么办呢,给他啊,谁调用的这个方法就给谁啊,这个栈使用列表做的对吧,栈是什么,后进先出,当以列表的首部作为栈底,尾部作为栈顶,那要返回的方法是不是应该从列表的尾部返回数据,pop不就是让列表的尾部数据弹出的方法吗,不解释pop,所以使用return将栈顶元素返回给使用者


ps: 一个逻辑结构可以由多个存储结构来完成,所以只不过这里是用了列表来完成这个模型,你也可以用其他的,只要满足线性结构、后进先出的原则,满足栈的使用方法,就行

我可能说的有一些不严谨,如果还有不理解的地方,或我有什么地方说错了,就和我说一下,我在改改

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-19 09:21:07 | 显示全部楼层
1223253411 发表于 2020-6-18 20:23
第一问:栈      首先你要知道栈模型是什么,你也说了它是一个后进先出的模型对吧,但!!!它是一种逻辑结 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 13:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表