【问题标题】:Confusions about stack implements关于堆栈实现的困惑
【发布时间】:2020-10-11 11:00:30
【问题描述】:

第一个代码只有两行。

input = "hkiehs nimala"
print(input[::-1])

输出是 alamin sheikh

这是另一个代码,但输出也与 .

class Stack():
def __init__(self):
    self.items = []

def push(self, item):
    self.items.append(item)             

def pop(self):
    return self.items.pop()

def is_empty(self):
    return self.items == []

def peek(self):
    if not self.is_empty():
        return self.items[-1]
    
def get_stack(self):
    return self.items

def reverse_string(stack, input_str):
  for i in range(len(input_str)):
    stack.push(input_str[i])
    rev_str = ""
 while not stack.is_empty():
   rev_str += stack.pop()

   return rev_str

stack = Stack()
input_str = "alamin sheikh"
print(reverse_string(stack, input_str))

也输出:与第一个代码相同 但是为什么呢? 这里的工作堆栈如何!

谢谢。

【问题讨论】:

标签: python stack


【解决方案1】:

堆栈的工作原理是 LIFO(后进先出),如果你想想象它就像放在桌子上的一副牌,你插入的第一张牌就是最后一个在位(最多在底部)!!

现在解释代码,正如您在堆栈程序中看到的那样,您首先循环整个字符串并将每个字符添加到堆栈中,因此首先添加第一个字符,然后是第二个,然后是第三个......就像这样当堆栈完成后,您将获得最后一个字符!

您的所有操作都以图形方式呈现:

然后您查看堆栈并拾取其最顶部的元素,因此字符串的反转形式!希望你理解,如果有任何问题,请在 cmets 中写下 :)

【讨论】:

    【解决方案2】:

    试试这个作为一个实验:拿四件你可以堆叠的东西,比如四枚不同的硬币。按从左到右的顺序排列它们。从左到右,将它们一一叠起来(所以最左边的硬币在堆栈的底部,之后的硬币在顶部,等等)。现在将它们从堆栈中取出并从左到右放置,因此您从堆栈中取出的第一件事是在左侧,您从堆栈中取出的第二件事就在旁边,等等。Presto - 他们'与他们开始时的顺序相反!

    “堆栈”数据结构的工作方式完全相同,这就是它被称为“堆栈”的原因。每次你把东西放在一个堆栈上时,它都会在顶部,所以如果你把字母ABCD按顺序放在一个堆栈上,它们就会按顺序从从下到上,D 在上:

                ->D
            ->C   C
        ->B   B   B
    ->A   A   A   A
    

    当你“弹出”一个堆栈时,你会移除最上面的项目。如果你从堆栈中弹出每个元素,并将每个元素添加到一个字符串中,会发生以下情况:

       "" + "D"<-D
                 C
                 B
                 A
    
    
      "D" + "C"<-C
                 B
                 A
    
    
     "DC" + "B"<-B
                 A
    
    
    "DCB" + "A"<-A
    

    所以最后,字符串的顺序与开始时的顺序相反,就像你的四个硬币一样!

    这种结构的另一个名称是“先进后出”(FILO)——您首先放入其中的东西就是您将要从中取出的最后东西,这就是您最终得到的东西如果您将一堆东西放入然后全部取出,则顺序相反。

    【讨论】:

      【解决方案3】:

      您概述的两种方法来自根本不同的角度。第一种方法,使用列表索引和切片,是处理可迭代对象(例如列表、字符串、元组或生成器)的 Pythonic 方式。在这种情况下,数据存储为字符串 ("alamin sheikh"),并通过 [::-1] 以相反的顺序返回。来自Python documentation

      >>> L = range(10)
      >>> L[::2] # every other element
      [0, 2, 4, 6, 8]
      >>> L[::-1] # reverse list
      [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
      >>> s='abcd'
      >>> s[::2] # every other character
      'ac'
      >>> s[::-1] # reverse string
      'dcba'
      

      第二种方法使用stack 数据结构来存储元素。理解堆栈的一种直观方法是从字面上想象一摞书。当有一堆书时,堆顶的书将是最近放置的书;最下面的那本是不久前放在堆里的一本书。在 CS 术语中,这称为 LIFO,或“后进先出”。

      提供的源代码是堆栈数据结构的 Python 实现,使用列表实现。由于您的问题似乎专门询问 reverse_string 函数如何与 Stack 类的实例一起使用,因此我将在这方面进行放大。

      我们可以分解reverse_string的作用如下:

      • input_str 存储在作为参数传递给函数的stack 对象中
      • stack 弹出元素直到stack 为空

      让我们看一个input_str = "alamin sheikh" 的例子。首先,在代码的 for 循环部分,我们遍历输入字符串并将每个字符压入堆栈。当我们完成推送后,stack 对象的内容将如下所示。

      ["a", "l", "a", "m", "i", "n", " ", "s", "h", "e", "i", "k", "h"]
      

      现在我们进入第 2 步,将元素从堆栈中弹出。回想一下,堆栈遵循 LIFO 结构。在这种情况下,最后一个字符"h" 是最后一个被压入堆栈的元素。因此,它将是第一个从列表中弹出的。

      # after first pop
      rev_str = "h"
      ["a", "l", "a", "m", "i", "n", " ", "s", "h", "e", "i", "k"]
      
      

      如果我们对stack 中的其余元素继续这些步骤,我们最终会得到反转的字符串。

      【讨论】:

      • 很高兴它有帮助!
      猜你喜欢
      • 2011-11-21
      • 2022-07-17
      • 2021-03-21
      • 2011-01-18
      • 2015-03-25
      • 2012-04-10
      • 2019-05-17
      • 2020-03-06
      • 2016-03-16
      相关资源
      最近更新 更多