博客
关于我
使用双端队列模拟栈
阅读量:436 次
发布时间:2019-03-06

本文共 2263 字,大约阅读时间需要 7 分钟。

class Node(object):
    def __init__(self,value=None,prev=None,next=None):
        self.value,self.prev,self.next = value,prev,next
class DoubleLinkedList(object):
    def __init__(self,maxsieze=None):
        self.maxsieze=maxsieze
        node = Node()
        node.next,node.prev = node,node
        self.root = node
        self.length = 0
    
    def __len__(self):
        return self.length
    def headnode(self):
        return self.root.next
    
    def tailnode(self):
        return self.root.prev
    
    def append(self,value):
        if self.maxsieze is not None and len(self) > self.maxsieze:
            raise Exception("List is Full")
        node = Node(value=value)
        tailnode = self.tailnode()
        tailnode.next = node
        node.prev = tailnode
        node.next = self.root
        self.root.prev = node  #互指
        self.length += 1
    def appendleft(self,value):
        if self.maxsieze is not None and len(self) > self.maxsieze:
            raise Exception("List is Full")
        node = Node(value=value)
        if self.root.next is self.root:             #如果链表为空
            node.next = self.root
            node.prev = self.root
            self.root.next = node
            self.root.prev = node
        else:
            node.prev = self.root
            headnode = self.root.next
            node.next = headnode
            headnode.prev = node
            self.root.next = node
        self.length += 1
    
    def remove(self,node):                          #删除为O(1) 所以删除节点而不是值
        if node is self.root:
            return
        else:
            node.prev.next = node.next
            node.next.prev = node.prev
        self.length -= 1
        return node
    def iter_node(self):
        if self.root.next is self.root:
            return
        curnode = self.root.next
        while curnode.next is not self.root:
            yield curnode
            curnode = curnode.next
        yield curnode
    def __iter__(self):
        for node in self.iter_node():
            yield node.value
    def iter_node_reverse(self):
        if self.root.prev is self.root:
            return
        curnode = self.root.prev
        while curnode.prev is not self.root:
            yield curnode
            curnode = curnode.prev
        yield curnode
class FullError(Exception):
    pass
class EmptyError(Exception):
    pass
class Deque(DoubleLinkedList):
    def pop(self):
        if len(self) == 0:
            raise EmptyError('None!')
        tailnode = self.tailnode()
        value = tailnode.value
        self.remove(tailnode)
        return value
    def popleft(self):
        if len(self) == 0:
            raise EmptyError('None!')
        headnode = self.headnode()
        value = headnode.value
        self.remove(headnode)
        return value
class stack(object):
    def __init__(self):
        self.deque = Deque()
    def push(self,value):
        return self.deque.append(value)
    
    def pop(self):
        return self.deque.pop()
    
    def __len__(self):
        return len(self.deque)
    

转载地址:http://yheyz.baihongyu.com/

你可能感兴趣的文章
Docker学习(十三)- docker rm 命令详解
查看>>
解决Eclipse左键无法查看maven第三方包的源代码,多图亲测可用【转】
查看>>
selnium远程机上传图片遇到的坑
查看>>
Kali安装Docker
查看>>
Java 持久化操作之 --XML
查看>>
程序员如何提高工作效率
查看>>
(转)在ASP.NET 中实现单点登录(利用Cache, 将用户信息保存在服务器缓存中)
查看>>
RabbitMQ核心概念篇
查看>>
权限管理系统系列之序言
查看>>
Java程序员学习Go指南(终)
查看>>
Go语言实现布谷鸟过滤器
查看>>
Mysql多数据库备份
查看>>
微信小程序setData子元素
查看>>
github: Permission denied (publickey). 问题解决方法
查看>>
Docker常用操作
查看>>
查看已经开放的端口,查看和清理tomcat日志文件
查看>>
ORA-00600: internal error code, arguments: [kole_t2u], [34]
查看>>
TX锁处理
查看>>
去除空格函数trim
查看>>
应用人员反馈报错,ORA-03137: TTC protocol internal error : [12333]
查看>>