前言
先复习一下几种数据结构吧。
链表,就是一个个结点,用指针的方式来连接起来,因为py的语言特点,我们只需要将next赋值为下一个对象的变量名即可。(变量名本身就可以理解成一个指针索引)
如果链表还有问题,看这里。
队列和栈,前两天用list实现了一个,在这里,也有讲解。
一个是first in first out,另一个是first in last out。
双向队列,就是两端都能插入删除的队列,这个的实现需要双向链表。
循环队列,之前是list实现的,这里我们用一次node,结构基于循环链表。
双向链表和循环链表在这里,都是讲过的,不再赘述。
实现链表
没有链表,我们都做不了。
链表的本质上就是一个个的结点么, 所以这里我先给出了结点的定义。
class _Node():
"""lightweight,nonpublic class for storing linked node"""
__slots__ = '_element','_next'
def __init__(self,element,next):
self._element = element
self._next = next
他那个__slots__对象,貌似是能节省一个dict,正常直接创建两个变量也是一样的。
我们将这个类放在整体的大类中就可以了。
栈:
class LinkedStack():
# 使用链表实现栈,链表第一项为栈顶,没有头节点
class _Node():
"""lightweight,nonpublic class for storing linked node"""
__slots__ = '_element','_next'
def __init__(self,element,next):
self._element = element
self._next = next
def __init__(self):
"""create an empty stack"""
self._head = None
self._size = 0
def __len__(self):
"""return the number of elementsin the stack"""
return self._size
def is_empty(self):
"""return true if the stack is empty"""
return self._size==0
def push(self,e):
"""add an element e to the top of the stack"""
self._head = self._Node(e,self._head)
self._size += 1
def top(self):
"""return(but not remove) the element at the top of the stack"""
if self.is_empty():
raise Empty('stack is empty')
return self._head._element
def pop(self):
"""remove and return the element from the top of the stack"""
if self.is_empty():
raise Empty(</