我正在尝试在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"""
答案 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()