Python: первый на первом выходе

Я новичок в Python, и у меня возникла проблема с этой программой:

Приведенная ниже программа - "Последний пришел первым" (LIFO). Я хочу сделать это в рамках программы First in First Out (FIFO).

from NodeList import Node

class QueueLL:

    def __init__(self):
        self.head = None


    def enqueueQLL(self,item):
        temp = Node(str(item))
        temp.setNext(self.head) 
        self.head = temp
        length = max(len(node.data) for node in self.allNodes()) if self.head else 0
        print('\u2510{}\u250c'.format(' '*length))
        for node in self.allNodes():
            print('\u2502{:<{}}\u2502'.format(node.data, length))
        print('\u2514{}\u2518'.format('\u2500'*length))

Вот NodeList:

class Node:

    def __init__(self,initdata):
        self.data = initdata
        self.next = None

    def getData(self):
        return self.data

    def getNext(self):
        return self.next

    def setData(self,newdata):
        self.data = newdata

    def setNext(self,newnext):
        self.next = newnext

ПРИМЕЧАНИЕ: "Радуга" должна быть в нижней части "Дуги" или в FIFO (на рисунке ниже LIFO)

Я подумываю добавить новое определение типа setPrevious в NodeList, но я не знаю как. (Честно говоря, я действительно новичок в этом self.head = ничего не пишу. Раньше я писал self.items = [])

Любая помощь и советы будут оценены! Спасибо!

3 ответа

Помимо целей обучения, я бы не советовал использовать пользовательскую структуру данных для создания LIFO или FIFO. Встроенный тип данных list В конце концов, это нормально.

Вы можете добавлять предметы, используя append метод и удалить их, используя pop, Для LIFO это будет выглядеть так:

stack = list()
stack.append(1)
stack.append(2)
stack.append(3)

print stack.pop()  #3
print stack.pop()  #2
print stack.pop()  #1

Если вы предоставите целочисленный аргумент для pop Вы можете указать, какой элемент удалить. Для FIFO используйте индекс 0 для первого элемента:

stack = list()
stack.append(1)
stack.append(2)
stack.append(3)

print stack.pop(0)  #1
print stack.pop(0)  #2
print stack.pop(0)  #3

Ну, учитывая, что ваш класс, вероятно, уже закончился, и вы не упомянули свой класс (или что это должен быть связанный список) в самом вопросе, я просто скажу вам встроенный простой способ сделать это, на данный момент, что, вероятно, больше относится к вашей текущей ситуации (и поможет людям, которые найдут ваш вопрос).

import sys;
if sys.version_info[0]>2: #Just making sure the program works with both Python 2.x and 3.x
    from queue import Queue
else:
    from Queue import Queue

q=Queue()
q.put("first") #Put an item on the Queue.
q.put("second")
q.put("third")

while not q.empty(): #If it's empty, the program will stall if you try to get from it (that's why we're checking)
    print(q.get()) #Get an item from the Queue

Это выводы

first
second
third

Правда, я не уверен, какие преимущества это имеет по сравнению с ответом Константиния, но, поскольку это включенный модуль, я думаю, что где-то должно быть преимущество. Я знаю, что они используются с потоками из модуля потоков. Есть больше функций, связанных с очередями, чем я упомянул здесь.

Чтобы узнать больше, откройте интерпретатор Python и введите:

from queue import Queue #or from Queue import Queue for 2.x
help(Queue) #Press q to exit the help

Не спрашивайте меня, что такое блокировка, но это может использовать термин, используемый в документации класса Queue: http://en.wikipedia.org/wiki/Blocking_%28computing%29

class Box:
    def __init__(self,data):
        self.data=data
        self.next=None        
class List:
    def __init__(self):
        self.head=None        
    def add(self,item):                
        temp=Box(item)                
        if self.head==None:
            self.head=temp
            self.prev=temp
        self.prev.next=temp
        self.prev=self.prev.next               
    def PrintList(self):
        while self.head!=None:
            print(self.head.data)
            self.head=self.head.next

myList=List()
myList.add("Vinoth")
myList.add("Karthick")
myList.add("Ganesh")
myList.add("Malai")
myList.add("Shan")
myList.add("Saravana")
myList.PrintList()
Другие вопросы по тегам