Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用for循环创建在堆栈上运行的堆栈和迭代器_Python_Oop_Iterator_Stack_Next - Fatal编程技术网

Python 使用for循环创建在堆栈上运行的堆栈和迭代器

Python 使用for循环创建在堆栈上运行的堆栈和迭代器,python,oop,iterator,stack,next,Python,Oop,Iterator,Stack,Next,我试图用后进先出原则创建一个堆栈。我能够做到这一点,只需使用推和弹出功能。但是我想创建一个iter和一个next函数来遍历堆栈。下面是我尝试过的,但无法真正理解其中的逻辑 class Stack: def __init__(self): self.stack = [] self.START = None self.END = None def push(self, item): self.stack.append(item) #print("i

我试图用后进先出原则创建一个堆栈。我能够做到这一点,只需使用推和弹出功能。但是我想创建一个iter和一个next函数来遍历堆栈。下面是我尝试过的,但无法真正理解其中的逻辑

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

由于要存储堆栈元素需要
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)

您的
迭代器
属性将始终为
None
,因为您会在第一次调用next时立即停止迭代。从Python文档中关于
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
可以将next视为对每个项调用,直到没有更多的项要处理:

从容器中返回下一个项目。如果没有其他项,则引发StopIteration异常

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

def\uuuu iter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
self.Iterator=len(self.stack)-1#初始化为最后一个元素的索引
回归自我
定义下一个(自我):
如果self.Iterator>=0:
当前值=self.stack[self.Iterator]
self.Iterator=self.Iterator-1#为下一步更新
返回当前值
else:#如果self.Iterator为-1,则停止
提出停止迭代

self。迭代器
初始化为
None
,并且从未更改,因此
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()中的
if
语句将始终为false。