首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >堆栈工具的混淆

堆栈工具的混淆
EN

Stack Overflow用户
提问于 2020-06-21 14:29:53
回答 3查看 75关注 0票数 0

--第一段代码只有两行.

代码语言:javascript
运行
复制
input = "hkiehs nimala"
print(input[::-1])

输出为alamin

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

代码语言:javascript
运行
复制
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))

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-21 14:49:21

你所描述的两种方法从根本上讲是不同的。第一种方法,使用列表索引和切片,是处理可迭代性(如列表、字符串、元组或生成器)的Pythonic方法。在这种情况下,数据被存储为一个字符串("alamin sheikh"),并通过[::-1]以相反的顺序返回。来自Python文档

代码语言:javascript
运行
复制
>>> 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对象的内容的样子。

代码语言:javascript
运行
复制
["a", "l", "a", "m", "i", "n", " ", "s", "h", "e", "i", "k", "h"]

现在我们进入第2步,在那里我们将元素从堆栈中弹出。回想一下,堆栈遵循LIFO结构。在本例中,最后一个字符"h"是被推到堆栈中的最后一个元素。因此,这将是第一个被弹出的名单。

代码语言:javascript
运行
复制
# after first pop
rev_str = "h"
["a", "l", "a", "m", "i", "n", " ", "s", "h", "e", "i", "k"]

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

票数 1
EN

Stack Overflow用户

发布于 2020-06-21 14:48:06

堆栈工作原理的LIFO (最后一个先出),如果你想想象它就像一个卡甲板躺在一张桌子上,你插入的第一张卡片将是最后一个位置(最多底部)!

现在解释代码,如您在堆栈程序中所看到的,首先遍历完整的字符串并将每个字符添加到堆栈中,因此首先添加字符,然后添加第二个字符,然后再添加第三个字符.就像这样,当堆栈完成时,你就得到了最上面的最后一个字符!

所有的操作都是这样的:

然后,您可以查看堆栈并拾取其顶部的大多数元素,从而反转字符串的形式!希望您能理解,如果有任何关切,请在评论中写下:)

票数 1
EN

Stack Overflow用户

发布于 2020-06-21 14:48:23

试一试这个实验:拿四件你可以堆放的东西,比如四枚不同的硬币。按顺序从左到右排列。从左到右依次叠起来(所以最左边的硬币在堆栈的底部,后面的硬币在上面,等等)。现在把它们从堆栈中拿出来,从左到右,所以你从堆栈上拿下来的第一件东西在左边,第二件东西就在它旁边,以此类推。普雷托--它们的顺序与它们开始的顺序相反!

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

代码语言:javascript
运行
复制
            ->D
        ->C   C
    ->B   B   B
->A   A   A   A

当你“弹出”一个堆栈时,你把最上面的东西取下来。如果从堆栈中弹出每个元素,并将每个元素添加到字符串中,则会发生如下情况:

代码语言:javascript
运行
复制
   "" + "D"<-D
             C
             B
             A


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


 "DC" + "B"<-B
             A


"DCB" + "A"<-A

所以,在最后,从它的开始,字符串是相反的顺序,就像你的四个硬币!

这种结构的另一个名称是“先入后出”(FILO) --你把它放进去的第一件事是你最不愿意拿出来的东西,那就是如果你把一堆东西放进去,然后把它全部拿出来,你就会得到相反的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62499926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档