鱼C论坛

 找回密码
 立即注册
查看: 2995|回复: 17

[已解决]第40课:类和对象,最后一题的5小问

[复制链接]
发表于 2021-2-22 14:16:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Peteryo01223 于 2021-2-22 16:22 编辑

原题: 定义一个栈(Stack)类,用于模拟一种具有后进先出(LIFO)特性的数据结构。至少需要有以下方法:
方法名        含义
isEmpty()        判断当前栈是否为空(返回 True 或 False)
push()        往栈的顶部压入一个数据项
pop()        从栈顶弹出一个数据项(并在栈中删除)
top()        显示当前栈顶的一个数据项
bottom()        显示当前栈底的一个数据项

标准答案 +  我自己写的注释
[code]class stack:
    def __init__(self, start = []):
    # 属于“魔法方法”,是Python自动产生的方法。
    # __init__方法,在创建对象后,会被自动调用。
   
        self.stack = [] # 定义一个空的栈。
        for x in start: # ?问1: 这必要吗?后面的code,不是定义了push函数了吗?
            self.push(x) # 同上问题。

    def isEmpty(self):
    # 属于“人为自定义”的方法。判断当前栈是否为空(返回 True 或 False)
        return not self.stack # ?问2:本句,为何并未按照题目要求,返回 True 或 False呢?

    def push(self, obj):
    # 属于“人为自定义”的方法。往栈的顶部压入一个数据项
        self.stack.append(obj) # 向栈里面,按照“后进先出”的顺序,append一个obj

    def pop(self):
    # 属于“人为自定义”的方法。从栈顶弹出一个数据项(并在栈中删除)
        if not self.stack:
        # ?问3:这是个简略表达吗?等同于:if self.stack == [] 空列表的意思?
            print('警告:栈为空!')
        else:
            return self.stack.pop()
            # 从栈里面,按照“后进先出”的顺序,pop出一个obj

    def top(self):
    # 属于“人为自定义”的方法。显示当前栈顶的一个数据项
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack[0]
            # ? 问4:这里如果用 print(self.stack[0]),也行吧?

    def bottom(self):
    # 属于“人为自定义”的方法。显示当前栈底的一个数据项
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack[0]

# ? 问5:以上code,运行后如何调用呢?请给几个实例。

5个小问题,总结如下:

问1:第7行和第8行code,必要吗?后面的code,不是定义了push函数了吗?
问2:第12行,为何并未按照题目要求,返回 True 或 False呢?
问3:第21行,是个简略表达吗?等同于:if self.stack == [] 空列表的意思?
问4:第32行,如果用 print(self.stack[0]),也行吧?
问5:以上code,运行后如何调用呢?请您帮助,展示几个实例吧,谢谢。[/

高手们回复后,预计18:00前,我第一时间给”最佳“。感谢您的耐心解答~
最佳答案
2021-2-22 16:38:16
问1: for x in start 是遍历列表start中的元素 , 然后将每一个元素x用push压入栈中
问2: self.stack返回自身init后生成的stack, 如果为空(空就是False), 前面加上 not 那么就是True, return not self.stack就是return True, 如果不为空, self.stack 和 not 进行运算返回False.
问3 :  对的原理和问2相似
问4 :  不一样, return不等于print, 新手一定要理解, 一个是返回(供别的函数/表达式使用), 一个是输出到屏幕
问5 :
stack stack_a(1, 2, 3)#创建实例stack_a
print(stack_a.isEmpty())#判断当前栈是否为空,并将结果打印
stack_a.push(4)#将4入栈
print(stack.top())#显示当前栈顶的一个数据项, 注意我这里将top()的返回值作为print的参数使用
if stack.top() == 1#这里演示将top()的返回值作为if表达式的一部分使用
    print(haha)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-22 16:38:16 | 显示全部楼层    本楼为最佳答案   
问1: for x in start 是遍历列表start中的元素 , 然后将每一个元素x用push压入栈中
问2: self.stack返回自身init后生成的stack, 如果为空(空就是False), 前面加上 not 那么就是True, return not self.stack就是return True, 如果不为空, self.stack 和 not 进行运算返回False.
问3 :  对的原理和问2相似
问4 :  不一样, return不等于print, 新手一定要理解, 一个是返回(供别的函数/表达式使用), 一个是输出到屏幕
问5 :
stack stack_a(1, 2, 3)#创建实例stack_a
print(stack_a.isEmpty())#判断当前栈是否为空,并将结果打印
stack_a.push(4)#将4入栈
print(stack.top())#显示当前栈顶的一个数据项, 注意我这里将top()的返回值作为print的参数使用
if stack.top() == 1#这里演示将top()的返回值作为if表达式的一部分使用
    print(haha)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-22 17:40:00 | 显示全部楼层
kishere 发表于 2021-2-22 16:38
问1: for x in start 是遍历列表start中的元素 , 然后将每一个元素x用push压入栈中
问2: self.stack返回 ...

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

使用道具 举报

 楼主| 发表于 2021-2-23 09:42:55 | 显示全部楼层
本帖最后由 Peteryo01223 于 2021-2-23 09:51 编辑
kishere 发表于 2021-2-22 16:38
问1: for x in start 是遍历列表start中的元素 , 然后将每一个元素x用push压入栈中
问2: self.stack返回 ...

stack stack_a(1, 2, 3)#创建实例stack_a
请问你写的这一句,为何Python运行不了啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 09:44:54 | 显示全部楼层
Peteryo01223 发表于 2021-2-23 09:42
请问你写的这一句,为何Python运行不了啊?

大哥,不加前面的“01.”啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 09:45:37 | 显示全部楼层
那个是第一行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 09:52:06 | 显示全部楼层
Peteryo01223 发表于 2021-2-23 09:42
请问你写的这一句,为何Python运行不了啊?

啊不好意思, 应该是 A = stack([1,2,3])
写C++写习惯了, 久不写python写混了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 09:52:47 | 显示全部楼层
yayc_zcyd 发表于 2021-2-23 09:44
大哥,不加前面的“01.”啊

还是不行呀
>>> stack stack_a(1, 2, 3)
SyntaxError: invalid syntax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 09:55:29 | 显示全部楼层
kishere 发表于 2021-2-23 09:52
啊不好意思, 应该是 A = stack([1,2,3])
写C++写习惯了, 久不写python写混了

还是不行啊。你能否在你的Python上试一下,然后原封不动贴过来。我是零基础,任何一个细节不对的话,我都弄不懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 09:58:42 | 显示全部楼层
class stack:
    def __init__(self, start = []):
    # 属于“魔法方法”,是Python自动产生的方法。
    # __init__方法,在创建对象后,会被自动调用。
   
        self.stack = [] # 定义一个空的栈。
        for x in start: # ?问1: 这必要吗?后面的code,不是定义了push函数了吗?
            self.push(x) # 同上问题。

    def isEmpty(self):
    # 属于“人为自定义”的方法。判断当前栈是否为空(返回 True 或 False)
        return not self.stack # ?问2:本句,为何并未按照题目要求,返回 True 或 False呢?

    def push(self, obj):
    # 属于“人为自定义”的方法。往栈的顶部压入一个数据项
        self.stack.append(obj) # 向栈里面,按照“后进先出”的顺序,append一个obj

    def pop(self):
    # 属于“人为自定义”的方法。从栈顶弹出一个数据项(并在栈中删除)
        if not self.stack:
        # ?问3:这是个简略表达吗?等同于:if self.stack == [] 空列表的意思?
            print('警告:栈为空!')
        else:
            return self.stack.pop()
            # 从栈里面,按照“后进先出”的顺序,pop出一个obj

    def top(self):
    # 属于“人为自定义”的方法。显示当前栈顶的一个数据项
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack[0]
            # ? 问4:这里如果用 print(self.stack[0]),也行吧?

    def bottom(self):
    # 属于“人为自定义”的方法。显示当前栈底的一个数据项
        if not self.stack:
            print('警告:栈为空!')
        else:
            return self.stack[0]
A = stack([1,2,3])
这个我试过了, 没问题, 变量名为A, 类型名是stack, 后面的变量名都替换成A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 10:01:40 | 显示全部楼层
kishere 发表于 2021-2-23 09:58
这个我试过了, 没问题, 变量名为A, 类型名是stack, 后面的变量名都替换成A
>>> A
<__main__.stack object at 0x0000028C172F7E50>
>>> stack(A)
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    stack(A)
  File "C:/Users/user/Desktop/20210223b.py", line 8, in __init__
    for x in start: # ?问1: 这必要吗?后面的code,不是定义了push函数了吗?
TypeError: 'stack' object is not iterable
这怎么用呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 10:02:24 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2021-2-23 10:02:54 | 显示全部楼层

运行了,什么也没打印出来。
>>> A
<__main__.stack object at 0x0000028C172F7E50>
>>> stack(A)
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    stack(A)
  File "C:/Users/user/Desktop/20210223b.py", line 8, in __init__
    for x in start: # ?问1: 这必要吗?后面的code,不是定义了push函数了吗?
TypeError: 'stack' object is not iterable
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 10:05:49 | 显示全部楼层
A是一个stack实例了
举个栗子:
 A.isEmpty())#判断当前栈是否为空
A.push(4)#将4入栈
print(A.top())#显示当前栈顶的一个数据项
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 10:07:25 | 显示全部楼层

把视频多看几遍吧, 我这样讲也不好讲, 类和对象是比较难懂. 理解了再操作会明了很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 10:14:35 | 显示全部楼层
kishere 发表于 2021-2-23 10:05
A是一个stack实例了
举个栗子:

第一行多了个括号吗?
A = stack([1,2,3])
A.isEmpty()#判断当前栈是否为空
A.push(4)#将4入栈
print(A.top())#显示当前栈顶的一个数据项
print(A.bottom())
为何.top()和bottom()的结果,都是1?
1
1
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 10:46:44 | 显示全部楼层
第一行没有多括号
.top()和bottom()的结果都是1是因为这两个函数你实现就一样, 我猜你是写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 11:16:25 From FishC Mobile | 显示全部楼层
多了吧,我看到你写的第一行一个(,却有两个))。且,有个if句子,最后后面没有:。没几个,我就晕了。

在14楼,你第一行写了个,A.isEmpty())#判断当前栈是否为空
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-2 03:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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