--第一段代码只有两行.
input = "hkiehs nimala"
print(input[::-1])
输出为alamin
这里是另一个代码,但输出也与.相同
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))
输出:与第一个代码相同,但为什么? 如何在这里工作!
谢谢。
发布于 2020-06-21 14:49:21
你所描述的两种方法从根本上讲是不同的。第一种方法,使用列表索引和切片,是处理可迭代性(如列表、字符串、元组或生成器)的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术语中,这被称为LIFO,或“最后一个进来,第一个输出”。
提供的源代码是用列表实现的堆栈数据结构的Python实现。由于您的问题似乎专门询问reverse_string
函数如何与Stack
类的实例一起工作,所以我将放大这方面的内容。
我们可以按以下方式细分reverse_string
所做的工作:
input_str
存储在作为参数传递给函数的stack
对象中stack
中的Pop元素,直到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
中的其余元素执行这些步骤,我们最终将得到相反的字符串。
发布于 2020-06-21 14:48:06
堆栈工作原理的LIFO (最后一个先出),如果你想想象它就像一个卡甲板躺在一张桌子上,你插入的第一张卡片将是最后一个位置(最多底部)!
现在解释代码,如您在堆栈程序中所看到的,首先遍历完整的字符串并将每个字符添加到堆栈中,因此首先添加字符,然后添加第二个字符,然后再添加第三个字符.就像这样,当堆栈完成时,你就得到了最上面的最后一个字符!
所有的操作都是这样的:
然后,您可以查看堆栈并拾取其顶部的大多数元素,从而反转字符串的形式!希望您能理解,如果有任何关切,请在评论中写下:)
发布于 2020-06-21 14:48:23
试一试这个实验:拿四件你可以堆放的东西,比如四枚不同的硬币。按顺序从左到右排列。从左到右依次叠起来(所以最左边的硬币在堆栈的底部,后面的硬币在上面,等等)。现在把它们从堆栈中拿出来,从左到右,所以你从堆栈上拿下来的第一件东西在左边,第二件东西就在它旁边,以此类推。普雷托--它们的顺序与它们开始的顺序相反!
“堆栈”数据结构的工作方式完全相同,这就是为什么它被称为“堆栈”。每次你把东西放在堆栈上,它就在顶部,所以如果你把字母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) --你把它放进去的第一件事是你最不愿意拿出来的东西,那就是如果你把一堆东西放进去,然后把它全部拿出来,你就会得到相反的结果。
https://stackoverflow.com/questions/62499926
复制相似问题