Python链接列表队列

时间:2014-03-24 03:24:25

标签: python

我正在尝试在python中创建一个链表队列,我无法弄清楚如何返回列表中的大小和第一项......这看起来很简单。我可以插入和删除,但我无法返回大小或第一项。有什么想法??

class Node(object):
  def __init__(self, item = None):
    self.item = item
    self.next = None
    self.previous = None


class Queue(object):
  def __init__(self):
    """post: creates an empty FIFO queue"""
    self.length = 0
    self.head = None
    self.tail = None

  def enqueue(self, x):
    """post: adds x at back of queue"""
    newNode = Node(x)
    newNode.next = None
    if self.head == None:
      self.head = newNode
      self.tail = newNode
    else:
      self.tail.next = newNode
      newNode.previous = self.tail
      self.tail = newNode

  def dequeue (self):
    """pre: self.size() > 0
        post: removes and returns the front item"""
    item = self.head.item
    self.head = self.head.next 
    self.length = self.length - 1
    if self.length == 0:
      self.last = None
    return item

  def front(self):
    """pre: self.size() > 0
        post: returns first item in queue"""
    return item[0]

  def size(self):
    """post: returns the number of itemes in queue"""

6 个答案:

答案 0 :(得分:1)

为了有效地报告链表的长度,您需要在每次添加元素时对其进行处理,并在每次删除元素时减少它。你已经在做后者,但不是前者。

因此,只需在self.length += 1方法的某处添加enqueue,然后size()可以简单return self.length

对于队列中的第一个元素,它始终是head节点中的项目。因此front()可以是return self.head.item

答案 1 :(得分:1)

Python列表已经完成了您所描述的内容。一些例子:

# create a list
l = ['foo', 'bar']

# get the first item
print(l.pop(0))

# add an item
l.append(42)
print(l)

# get the size
print(len(l))

答案 2 :(得分:1)

这两种方法中的代码没有任何意义。你如何索引项目?它只是Node类的一个字段,而不是一个数组。为什么 front()不会立即引导您考虑 head

令人惊讶的是,你的其余代码似乎没问题。这就是你需要的:

def front(self):
    return self.head.item

def size(self):
    return self.length

此外,您还没有在 enqueue()方法中增加 self.length

您遇到这些问题的事实应该是一个有用的线索,您不能真正理解其余的代码。我已经看到初学者经常陷入这种反复试验的过程中,在这种方法中,你会捣乱一些东西直到它起作用,通常从你从某个地方获得的一些代码开始。这导致了令人痛苦的脆弱代码,因为您的理解也很脆弱。这是编写合理代码的方式。充其量只是建立理解的起点 - 在这种情况下,捣蛋是完全正确的事情。通过实验和所有这些来学习。

我建议您仔细阅读您发布的代码,并建立一个相当完整的心理模型,了解它的运作方式。绘制图片或其他任何东西可以帮助您理解它们实现的部分和过程。心智模型的深度是编程技巧的关键组成部分。

另外,除了练习或其他什么之外,你真的不需要去编写这些课程的所有麻烦。 Python列表已经有了使它们可以用作队列的方法。

答案 3 :(得分:0)

跳出来的第一件事就是当你排队时你需要增加列表的长度。 size()应该只需要在完成后返回列表的长度。 然后访问列表的第一项,您似乎尝试使用列表不支持的列表语法(至少在我能看到的代码中)。而是返回self.head

答案 4 :(得分:0)

类节点: def init (自身,数据): self.data =数据 self.next =无

班级队列:

procedure CheckCodeWebService(_accessToken: Text; _salesHeader: record "Sales Header")
var
    jsonRequest: Text;
    txtResponse: InStream;
    Url: Text;
    client: HttpClient;
    request: HttpRequestMessage;
    response: HttpResponseMessage;
    contentHeaders: HttpHeaders;
    content: HttpContent;
begin
    jsonRequest := '{' +
        '"GetPurchaseOrder": {' +
            '"value": {' +
                '"DataArea": {' +
                    '"PurchaseOrder": [' +
                        '{' +
                            '"PurchaseOrderHeader": {' +
                                '"ID": {' +
                                    '"value": ""' +
                                '},' +
                                '"DocumentReference": [' +
                                    '{' +
                                        '"ID": {' +
                                            '"value": " ' + _salesHeader.DealID + ' "' +
                                        '}' +
                                    '}' +
                                '],' +
                                '"SalesOrderReference": [' +
                                    '{' +
                                        '"ID": {' +
                                        '"value": " ' + _salesHeader.SalesOrderNroCisco + ' "' +
                                        '}' +
                                    '}' +
                                '],' +
                                '"Description": [' +
                                    '{' +
                                        '"value": "yes",' +
                                        '"typeCode": "details"' +
                                    '}' +
                                ']' +
                            '}' +
                        '}' +
                    ']' +
                '},' +
                '"ApplicationArea": {' +
                    '"CreationDateTime": "datetime",' +
                    '"BODID": {' +
                        '"value": "BoDID-test",' +
                        '"schemeVersionID": "V1"' +
                    '}' +
                '}' +
            '}' +
        '}' +
    '}';
    content.WriteFrom(jsonRequest);
    content.GetHeaders(contentHeaders);
    contentHeaders.Clear();
    contentHeaders.Add('Content-Type', 'application/json');
    request.GetHeaders(contentHeaders);
    contentHeaders.Add('Authorization', StrSubstNo('Bearer %1', _accessToken));
    contentHeaders.Add('Accept', 'application/xml');

    request.Content := content;

    Url := 'https://api.xxxx.com/xxxxx/ORDER/v2/sync/xxxxxxxx';

    request.SetRequestUri(Url);
    request.Method := 'POST';

    client.Send(request, response);
    response.Content().ReadAs(txtResponse);

答案 5 :(得分:0)

_NodeLinked 类是创建节点:

  class _NodeLinked:
   # slots is memory efficient way to store the instance attributes
    __slots__ = '_element', '_next'
    def __init__(self, element, next):
        self._element = element
        self._next = next

 class QueuesLinked:
  # each instance being initialized an empty list
    def __init__(self):
        self._front = None
        self._rear = None
        self._size = 0

    def __len__(self):
        return self._size

    def isempty(self):
        return self._size == 0
   # adding a node to the end of the list
    def enqueue(self, e):
        newest = _NodeLinked(e, None)
        if self.isempty():
            self._front = newest
        else:
            self._rear._next = newest
        self._rear = newest
        self._size += 1
   # removing first node
    def dequeue(self):
        if self.isempty():
            print('Queue is empty')
            return
        e = self._front._element
        self._front = self._front._next
        self._size -= 1
        if self.isempty():
            self._rear = None
        return e

    def first(self):
        if self.isempty():
            print('Queue is empty')
            return
        return self._front._element

    def display(self):
        p = self._front
        while p:
            print(p._element,end=' <-- ')
            p = p._next
        print()