python双循环_双端循环列表实现栈(python)

#-*- coding: utf-8 -*-

from collections importdequeclassNode(object):def __init__(self, value=None, prev=None, next=None):

self.value, self.prev, self.next=value, prev, nextclassCircularDoubleLinkedList(object):def __init__(self, maxsize=None):

self.maxsize=maxsize

node=Node()

node.next, node.prev=node, node

self.root=node

self.length=0def __len__(self):returnself.lengthdefheadnode(self):returnself.root.nextdeftailnode(self):returnself.root.prevdefappend(self, value):if self.maxsize is not None and len(self) >=self.maxsize:raise Exception('LinkedList is Full')

node= Node(value=value)

tailnode= self.tailnode() orself.root

tailnode.next=node

node.prev=tailnode

node.next=self.root

self.root.prev=node

self.length+= 1

defappendleft(self, value):if self.maxsize is not None and len(self) >=self.maxsize:raise Exception('LinkedList is Full')

node= Node(value=value)if self.root.next is self.root: #empty

node.next =self.root

node.prev=self.root

self.root.next=node

self.root.prev=nodeelse:

node.prev=self.root

headnode=self.root.next

node.next=headnode

headnode.prev=node

self.root.next=node

self.length+= 1

defremove(self, node):if node isself.root:return

else: # node.prev.next =node.next

node.next.prev=node.prev

self.length-= 1

returnnodedefiter_node(self):if self.root.next isself.root:returncurnode=self.root.nextwhile curnode.next is notself.root:yieldcurnode

curnode=curnode.nextyieldcurnodedef __iter__(self):for node inself.iter_node():yieldnode.valuedefiter_node_reverse(self):if self.root.prev isself.root:returncurnode=self.root.prevwhile curnode.prev is notself.root:yieldcurnode

curnode=curnode.prevyieldcurnodeclassDeque(CircularDoubleLinkedList):defpop(self):"""删除尾节点"""

if len(self) ==0:raise Exception('empty')

tailnode=self.tailnode()

value=tailnode.value

self.remove(tailnode)returnvaluedefpopleft(self):if len(self) ==0:raise Exception('empty')

headnode=self.headnode()

value=headnode.value

self.remove(headnode)returnvaluedeftest_deque():

dq=Deque()

dq.append(1)

dq.append(2)assert list(dq) == [1, 2]

dq.appendleft(0)assert list(dq) == [0, 1, 2]

dq.pop()assert list(dq) == [0, 1]

dq.popleft()assert list(dq) == [1]

dq.pop()assert len(dq) ==0classStack(object):def __init__(self):

self.deque=Deque()defpush(self, value):

self.deque.append(value)defpop(self):returnself.deque.pop()classStack2(object):def __init__(self):

self._deque=deque()defpush(self, value):returnself._deque.append(value)defpop(self):returnself._deque.pop()defempty(self):return len(self._deque) ==0deftest_stack():

s=Stack()

s.push(0)

s.push(1)

s.push(2)assert s.pop() == 2

assert s.pop() == 1

assert s.pop() ==0import pytest #pip install pytest

with pytest.raises(Exception) as excinfo:

s.pop()assert 'empty' instr(excinfo.value)if __name__ == '__main__':

test_stack()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值