【问题标题】:How do I code a proxy for the .pop method without actually using the .pop method?如何在不实际使用 .pop 方法的情况下为 .pop 方法编写代理代码?
【发布时间】:2022-10-13 05:40:34
【问题描述】:

我正在尝试(我已经解决了它,只是不是“正确”的方式)来解决以下问题:

堆栈是一种列表类型,而不是访问 列表中的任何项目,您只能添加 或从堆栈顶部删除项目。

将新项目添加到堆栈中称为“推送” 项目到堆栈上。删除顶部的项目 堆栈被称为“弹出”堆栈中的项目。 当一个项目从堆栈中“弹出”时,它会被移除 完全从列表中。 编写一个名为 Stack 的类。堆栈应该有 以下方法:

一个在里面初始化空列表的方法 那是堆栈的内容。

采用一个参数的 stack_push() 方法(在 除了自我):推到顶部的项目 的堆栈。

返回当前顶部的 stack_pop() 方法 堆栈上的项目并将其从底层移除 列表。如果列表已经为空,则返回 没有任何。

例如,以下代码将打印 数字 3、2 和 1(按此顺序)。请注意,这 是它们被推动的相反顺序: pop 方法将始终返回 添加它们的相反顺序。

new_stack = Stack()
new_stack.stack_push(1)
new_stack.stack_push(2)
new_stack.stack_push(3)
print(new_stack.stack_pop())
print(new_stack.stack_pop())
print(new_stack.stack_pop())

在此处添加您的课程!

这是我想出的:

class Stack:
     def __init__(self):
         self.a_list =[]
   
     def stack_push(self,num):
         self.a_list.append(num)
        
     def stack_pop(self):
         return self.a_list.pop()

这可行,但我不允许在最后一行使用 .pop 方法。有什么想法吗?这是测试我的课程的代码:

以下代码行将测试您的课程。 如果它工作正常,它将打印 3、2 和 1 按照这个顺序,每个人都在自己的路线上。

new_stack = Stack()
new_stack.stack_push(1)
new_stack.stack_push(2)
new_stack.stack_push(3)
print(new_stack.stack_pop())
print(new_stack.stack_pop())
print(new_stack.stack_pop())

我的代码确实按此顺序打印 3,2,1,每个整数在单独的行上。不过,我不应该使用 .pop ,直到我解决了这个问题后我才意识到。另外,我基本上是一个初学者,并且在这个问题中被介绍了 .pop 方法。

【问题讨论】:

    标签: python


    【解决方案1】:

    实现堆栈的一种可能方法是模拟实际 CPU 堆栈在您的计算机上的工作方式:

    • 为堆栈分配一个很长的列表
    • 有一个整数变量,它包含堆栈中最后使用的位置,我们称之为SP
    • push 增加 SP 并将值放入 stack[SP]
    • pop 返回 stack[SP] 并减少 SP

    请注意,您还需要处理堆栈不足和溢出(您的原始代码也缺少这些)。

    【讨论】:

      【解决方案2】:

      附加到列表的最后一个元素可以用

      last_el = self.a_list[-1]
      

      但是您仍然需要将其从列表中删除以“弹出”它, 所以你可以这样做

      self.a_list = self.a_list[:-1]
      

      总之,你得到:

      def stack_pop(self):
        last_el = self.a_list[-1]
        self.a_list = self.a_list[:-1]
        return last_el
      

      但这可能比使用 .pop() 效率低。

      【讨论】:

      • 好的谢谢。我也试过这个,它只是返回我的列表 3 次。
      猜你喜欢
      • 2018-07-15
      • 2012-09-30
      • 1970-01-01
      • 2019-04-14
      • 2019-10-30
      • 2017-12-09
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多