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