提问者:小点点

堆栈工具的混淆


第一个代码只有两行。

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))

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

谢谢。


共3个答案

匿名用户

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

现在解释代码,这里正如你在堆栈程序中看到的,你首先循环整个字符串,并将每个字符添加到堆栈中,所以第一个字符是先添加的,然后是第二个,然后是第三个。。。 像这样,当堆栈完成时,你得到最后一个字符在顶部最多的点!

然后查看堆栈并拾取其顶部最多的元素,因此是字符串的反向形式! 希望你能理解,如果有什么担心,请在评论中写下来:)

匿名用户

试着做一个实验:拿四个你可以堆放的东西,比如四个不同的硬币。 把它们从左到右排列起来。 从左到右,把它们一个一个地叠起来(所以最左边的硬币放在叠起来的底部,之后的硬币放在上面,以此类推)。 现在把它们从堆叠上取下来,从左到右排列,所以第一个取下堆叠的东西在左边,第二个取下堆叠的东西在旁边,等等,很快--它们的顺序与它们开始的顺序相反!

“堆栈”数据结构的工作方式完全相同,这就是为什么它被称为“堆栈”的原因。 每次将某物放到堆栈上时,它都会放在堆栈的顶部,因此,如果将字母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)--你首先放进去的东西是你最后拿出来的东西,也就是说,如果你把一堆东西放进去,然后把它们全部拿出来,你就会以相反的顺序结束事情的结果了。(first in,lastout out,first in,lastout out,first in,lastout out。

匿名用户

您概述的两种方法来自根本不同的角度。 第一种方法,使用列表索引和切片,是Pythonic处理迭代的方法,如列表,字符串,元组或生成器。 在本例中,数据存储为字符串(“Alamin Sheikh”),并通过[::-1]以相反的顺序返回。 来自Python文档:

>>> 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'

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

提供的源代码是堆栈数据结构的Python实现,用列表实现。 由于您的问题似乎特别询问reverse_string函数如何与stack类的实例一起工作,因此我将放大这方面的内容。

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

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

让我们通过一个input_str=“Alamin Sheikh”的示例。 首先,在代码的for循环部分,我们迭代输入字符串并将每个字符推送到堆栈。 完成推送后,这就是stack对象的内容。

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

现在我们进入第2步,在这里我们将元素弹出堆栈。 回想一下,堆栈遵循后进先出结构。 在本例中,最后一个字符“h”是推入堆栈的最后一个元素。 因此,它将是从列表中弹出的第一个。

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

如果我们对堆栈中的其余元素继续这些步骤,我们最终将以反向字符串结束。