Python数据结构4——循环链表与堆栈、队列
循环链表的实现:
class Node(object):
'单链表的节点'
def __init__(self,item):
#item存放数据元素
self.item=item
#next是下一个节点的标识
self.next=None
class Node(object):
'单链表的节点'
def __init__(self,item):
#item存放数据元素
self.item=item
#next是下一个节点的标识
self.next=None
class SingleCycleLinkList(object):
'单向循环链表'
def __init__(self,node=None):
self.__head=node
if node:
node.next=node
def is_empty(self):
'链表是否为空'
return self.__head ==None
def length(self):
'长度'
if self.is_empty():
return 0
# cur游标,用来移动遍历节点
cur = self.__head
# count记录数量
count = 1
while cur.next!= self.__head:
cur = cur.next
count += 1
return count
def travel(self):
'遍历'
#cur游标,用来移动遍历节点
if self.is_empty():
return
cur=self.__head
while cur.next!= self.__head:
print(cur.item,end=' ')
cur=cur.next
print(cur.item)
print()
def add(self,item):
'头部添加元素'
node = Node(item)
cur = self.__head
if self.is_empty():
self.__head=node
node.next=node
else:
while cur.next != self.__head:
cur = cur.next
node.next=self.__head
#上式表示把head指向的节点赋值给node
self.__head = node
cur.next=node
def append(self,item):
'单尾部添加元素'
node=Node(item)
if self.is_empty():
self.__head=node
node.next=node
else:
cur=self.__head
while cur.next!=self.__head:
cur=cur.next
cur.next=node
node.next=self.__head
def insert(self,pos,item):
'''指定位置添加元素
:param pos 从0开始
'''
node = Node(item)
pre=self.__head
if pos<=0:
self.add(item)
elif pos>self.length()-1:
self.append(item)
else :
count = 0
while count<(pos-1):
count+=1
pre=pre.next
node.next=pre.next
pre.next=node
def search(self,item):
'查找节点是否存在'
cur=self.__head
if self.is_empty():
return False
while cur.next!=self.__head:
if cur.item==item:
return True
else:
cur=cur.next
if cur.item==item:
return True
return False
def remove(self,item):
'删除节点'
if self.is_empty():
return
while self.search(item)==True:
pre = None
cur = self.__head
while cur.next!=self.__head:
if cur.item==item:
#先判断此节点是不是头节点
if (pre==None):
# 找尾节点
rear=self.__head
while rear.next!=self.__head:
rear=rear.next
self.__head=cur.next
rear.next=self.__head
else:
#中间节点
pre.next=cur.next
break
else:
pre=cur
cur=cur.next
#退出循环cur指向尾节点
if cur.item == item:
if cur==self.__head:
self.__head==None
else:
pre.next=cur.next
return('结束')
if __name__=='__main__':
ll=SingleCycleLinkList()
ll.append(1)
ll.append(2)
ll.append(2)
ll.append(4)
ll.append(2)
ll.add(2)
ll.insert(-1,100)
ll.travel()
ll.remove(2)
ll.travel()
栈与队列
栈
队列
栈的实现
class Stack(object):
'栈'
def __init__(self):
self.__list=[]
def push(self,item):
'添加一个新元素item到栈顶'
self.__list.append(item)
def pop(self):
'弹出栈顶元素'
return self.__list.pop()
def peek(self):
'返回栈顶元素'
if self.__list:
return self.__list[-1]
else:
return None
def is_empty(self):
'判断栈是否为空'
return self.__list==[]
#空的列表就是假
def size(self):
'返回栈的元素个数'
return len(self.__list)
if __name__=='__main__':
s=Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
队列的实现
class Queue(object):
'队列'
def __init__(self):
self.__list=[]
def enqueue(self,item):
'在尾部添加元素'
self.__list.append(item)
def dequeue(self):
'头部删除元素'
return self.__list.pop(0)
def is_empty(self):
return self.__list==[]
def size(self):
return len(self.__list)
if __name__=='__main__':
s=Queue()
s.enqueue(1)
s.enqueue(2)
s.enqueue(3)
s.enqueue(4)
print(s.dequeue())
print(s.dequeue())
print(s.dequeue())
print(s.dequeue())
双端队列
class Deque(object):
class Queue(object):
'队列'
def __init__(self):
self.__list = []
def add_front(self,item):
self.__list.insert(0,item)
def add_rear(self, item):
'在尾部添加元素'
self.__list.append(item)
def pop_front(self):
'头部删除元素'
return self.__list.pop(0)
def pop_rear(self):
return self.__list.pop()
def is_empty(self):
return self.__list == []
def size(self):
return len(self.__list)
if __name__ == '__main__':
s = Queue()
s.add_front(1)
s.add_front(2)
s.add_rear(3)
s.add_rear(4)
print(s.pop_front())
print(s.pop_front())
print(s.pop_rear())
print(s.pop_rear())