创建一个使用 for 循环运行堆栈的堆栈和迭代器



我正在尝试使用LIFO主体创建一个堆栈。我只需使用推送和弹出功能即可做到这一点。但是我想创建一个迭代器和下一个函数来遍历堆栈。以下是我尝试过的,但无法真正弄清楚逻辑。

class Stack:
  def __init__(self):
     self.stack = []
     self.START = None
     self.END = None
def push(self, item):
    self.stack.append(item)
    #print("item added to stack")
def pop(self):
    return self.stack.pop()
    #print("value removed according to LIFO")
def emptystack(self):
    return len(self.stack) == 0
def __iter__(self):
    self.Iterator = self.START
    return self
def __next__(self):
    if self.Iterator != None:
        stack = self.Iterator
        self.Iterator = self.Iterator.NEXT
        return node
    else:
        raise StopIteration

def fullstack(self):
    return self.stack
s = Stack()
s.push('1')
s.push('2')
s.push('6')
s.push('8')
s.push('11')
s.push('12')
s.pop()
s.push('50')
if s.emptystack():
   print("Stack is empty")
else:
   print(s.fullstack())

您的 Iterator 属性将始终None,因为一旦第一次调用下一个,您就会停止迭代。将 next 视为为每个项目调用,直到没有更多项目要处理,来自 Python 文档中关于__next__

从容器中返回下一项。如果没有其他项,请引发停止迭代异常

您可以做的一件事是将self.Iterator初始化为堆栈的长度(以__iter__为单位),然后在每一步中递减它,直到达到 0(然后提高 StopIteration):

def __iter__(self):
    self.Iterator = len(self.stack) - 1  # initialize to the index of the last element
    return self
def __next__(self):
    if self.Iterator >= 0:
        current_value = self.stack[self.Iterator]
        self.Iterator = self.Iterator - 1  # update for the next step
        return current_value
    else: # stop if self.Iterator is -1
        raise StopIteration

由于存储堆栈元素list,因此可以使用 python 的iter函数返回迭代器并使用它。

class Stack:
    def __init__(self):
        self.stack = []
    def push(self, item):
        self.stack.append(item)
    #print("item added to stack")
    def pop(self):
        return self.stack.pop()
    #print("value removed according to LIFO")
    def emptystack(self):
        return len(self.stack) == 0
    def stack_iter(self):
        return iter(self.stack)
    def stack_iter_next(self, iterator):
        return next(self.Iterator)
    def fullstack(self):
        return self.stack
s = Stack()
s.push('1')
s.push('2')
s.push('6')
s.push('8')
s.push('11')
s.push('12')
s.pop()
s.push('50')
s_iter = s.stack_iter()
for x in s_iter:
    print (x)

最新更新