Создание стека и итератора, который запускает весь стек, используя цикл for - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь создать стек с принципалом LIFO. Я могу сделать это, используя только функцию push и pop. Но я хочу создать 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())

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Ваш атрибут Iterator всегда будет None, потому что вы останавливаете итерацию, как только произойдет первый вызов next .Думайте о next как о том, что он вызывается для каждого элемента, пока нет больше элементов для обработки, из документации Python о __next__:

Верните следующий элемент из контейнера.Если больше нет предметов, выведите исключение StopIteration

Единственное, что вы можете сделать, это инициализировать self.Iterator длиной стека (в __iter__), затем на каждом шаге уменьшать его доВы достигаете 0 (а затем повышаете StopItate):

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
0 голосов
/ 19 января 2019

Поскольку вы list сохраняете элементы стека, вы можете использовать функцию iter в python, чтобы вернуть итератор и использовать его.

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