7

我是 python 的初学者,我遇到了这个程序的问题:

下面的程序是后进先出 (LIFO)。我想让它成为先进先出 (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))

这是节点列表:

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

注意:“Rainbow”应该在“Arc”的底部或在 FIFO 中(下图是 LIFO)

我正在考虑在 NodeList 中放置一个新的定义,例如 setPrevious 但我不知道如何。(老实说,我对这些 self.head = none 东西真的很陌生。我曾经写过 self.items = [])

任何帮助和提示将不胜感激!谢谢!

4

3 回答 3

29

除了学习目的之外,我不建议使用自定义数据结构来制作 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
于 2013-10-07T08:24:43.540 回答
1

好吧,鉴于您的课程可能现在已经结束并且您没有在问题本身中提及您的课程(或者它必须是一个链接列表),我只会告诉您内置的简单方法,现在,这可能与您当前的情况更相关(并且会帮助找到您问题的人)。

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

不要问我什么是阻塞,但这可能会使用它在队列类文档中的使用方式: http://en.wikipedia.org/wiki/Blocking_(computing)

于 2014-06-25T19:27:11.347 回答
0
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()
于 2018-05-12T14:33:55.453 回答