第一个代码只有两行。
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))
输出也:与第一个代码相同,但为什么? 这里的工作如何堆叠!
谢谢。
Stack的工作原理是后进先出(后进先出),如果你想想象它就像一副牌躺在桌子上,你插入的第一张牌将是最后一张在位置上(最多是底部)!!
现在解释代码,这里正如你在堆栈程序中看到的,你首先循环整个字符串,并将每个字符添加到堆栈中,所以第一个字符是先添加的,然后是第二个,然后是第三个。。。 像这样,当堆栈完成时,你得到最后一个字符在顶部最多的点!
然后查看堆栈并拾取其顶部最多的元素,因此是字符串的反向形式! 希望你能理解,如果有什么担心,请在评论中写下来:)
试着做一个实验:拿四个你可以堆放的东西,比如四个不同的硬币。 把它们从左到右排列起来。 从左到右,把它们一个一个地叠起来(所以最左边的硬币放在叠起来的底部,之后的硬币放在上面,以此类推)。 现在把它们从堆叠上取下来,从左到右排列,所以第一个取下堆叠的东西在左边,第二个取下堆叠的东西在旁边,等等,很快--它们的顺序与它们开始的顺序相反!
“堆栈”数据结构的工作方式完全相同,这就是为什么它被称为“堆栈”的原因。 每次将某物放到堆栈上时,它都会放在堆栈的顶部,因此,如果将字母a
,b
,c
和D
按这样的顺序放在堆栈上,它们会按这样的顺序从下往上排列,其中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"]
如果我们对堆栈
中的其余元素继续这些步骤,我们最终将以反向字符串结束。