链表实现队列(python)
# -*- coding: utf-8 -*- from collections import deque class Node(object):
def __init__(self, value=None, next=None):
self.value = value
self.next = next def __str__(self):
return '<Node: value: {}, next={}>'.format(self.value, self.next) __repr__ = __str__ class LinkedList(object):
""" 链接表 ADT
[root] -> [node0] -> [node1] -> [node2]
""" def __init__(self, maxsize=None):
"""
:param maxsize: int or None, 如果是 None,无限扩充
"""
self.maxsize = maxsize
self.root = Node() # 默认 root 节点指向 None
self.tailnode = None
self.length = 0 def __len__(self):
return self.length def append(self, value): # O(1)
if self.maxsize is not None and len(self) >= self.maxsize:
raise Exception('LinkedList is Full')
node = Node(value)
tailnode = self.tailnode
if tailnode is None:
self.root.next = node
else:
tailnode.next = node
self.tailnode = node
self.length += 1 def appendleft(self, value):
headnode = self.root.next
node = Node(value)
self.root.next = node
node.next = headnode
self.length += 1 def __iter__(self):
for node in self.iter_node():
yield node.value def iter_node(self):
"""遍历 从 head 节点到 tail 节点"""
curnode = self.root.next
while curnode is not self.tailnode: # 从第一个节点开始遍历
yield curnode
curnode = curnode.next # 移动到下一个节点
yield curnode def remove(self, value): # O(n)
""" 删除包含值的一个节点,将其前一个节点的 next 指向被查询节点的下一个即可 :param value:
"""
prevnode = self.root #
curnode = self.root.next
for curnode in self.iter_node():
if curnode.value == value:
prevnode.next = curnode.next
del curnode
self.length -= 1
return 1 # 表明删除成功
else:
prevnode = curnode
return -1 # 表明删除失败 def find(self, value): # O(n)
""" 查找一个节点,返回序号,从 0 开始 :param value:
"""
index = 0
for node in self.iter_node(): # 我们定义了 __iter__,这里就可以用 for 遍历它了
if node.value == value:
return index
index += 1
return -1 # 没找到 def popleft(self): # O(1)
""" 删除第一个链表节点
"""
if self.root.next is None:
raise Exception('pop from empty LinkedList')
headnode = self.root.next
self.root.next = headnode.next
self.length -= 1
value = headnode.value
del headnode
return value def clear(self):
for node in self.iter_node():
del node
self.root.next = None
self.length = 0 class EmptyError(Exception):
"""自定义异常"""
pass class Queue(object):
def __init__(self, maxsize=None):
self.maxsize = maxsize
self._item_link_list = LinkedList() def __len__(self):
return len(self._item_link_list) def push(self, value): # O(1)
""" 队尾添加元素 """
return self._item_link_list.append(value) def pop(self):
"""队列头部删除元素"""
if len(self) <= 0:
raise EmptyError('empty queue')
return self._item_link_list.popleft() def test_queue():
q = Queue()
q.push(0)
q.push(1)
q.push(2) assert len(q) == 3 assert q.pop() == 0
assert q.pop() == 1
assert q.pop() == 2 import pytest # pip install pytest
with pytest.raises(EmptyError) as excinfo:
q.pop()
assert 'empty queue' == str(excinfo.value) class MyQueue:
"""
使用 collections.deque 可以迅速实现一个队列
"""
def __init__(self):
self.items = deque() def append(self, val):
return self.items.append(val) def pop(self):
return self.items.popleft() def __len__(self):
return len(self.items) def empty(self):
return len(self.items) == 0 def front(self):
return self.items[0]
链表实现队列(python)的更多相关文章
- Java数据结构——用双端链表实现队列
//================================================= // File Name : LinkQueue_demo //---------------- ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- 第二百九十二节,RabbitMQ多设备消息队列-Python开发
RabbitMQ多设备消息队列-Python开发 首先安装Python开发连接RabbitMQ的API,pika模块 pika模块为第三方模块 对于RabbitMQ来说,生产和消费不再针对内存里的一 ...
- 使用python实现数组、链表、队列、栈
引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...
- 数据结构:栈 顺序表方法和单链表方法(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- class StackUnderflow(ValueError): pass #链表节点 class Node ...
- 【原创】C++链表如何像Python List一样支持多种数据类型
用过Python的码友都知道,Python中List支持多种数据类型,如下面代码所示链表li内的数据类型可以是整数,同时也可以是字符串,当然也可以是其他数据类型. 1: >>> li ...
- 利用 C++ 单向链表实现队列
利用C++ 单向链表实现数据结构队列,其实和上一篇基本内容相同,仅仅是插入的时候在链表的尾部插入,取元素都是一样的,都从头部取. #pragma once #include "stdio.h ...
- chapter11_2 Lua链表与队列
链表 由于table是动态的实体,所以在Lua中实现链表是很方便的.每个节点以一个table来表示,一个“链表”只是节点table中的一个字段. 该字段包含了对其他table的引用.例如,要实现一个基 ...
- 队列queue(2):链表实现队列
基本概念 队列是只允许在一端进行插入操作,另一端进行删除操作的线性表. 我们规定,允许删除的叫做队首"head",允许插入的叫做队尾"tail". 基本操作 我 ...
随机推荐
- AWS 架构最佳实践概述(十一)
AWS 架构最佳实践 AWS合理架构的框架支柱 安全性 - 保护并监控系统 能够保护信息.系统和资产 通过风险评估和缓解策略 可靠性 - 从故障中恢复并减少中断 从基础设施或服务故障中恢复 动态获取计 ...
- SQL优化————Insert
1.如果是非生产环境,可以先将索引和约束删掉,等数据插入完之后,再建立索引和约束. 2.如果一次性插入数据较大,可以使用游标,每次小批量的插入数据. 3.如果数据表太大,可以构建历史表,老数据通常不会 ...
- Pytorch 网络结构可视化
安装 conda install graphvizconda install tensorwatch 载入库 import sysimport torchimport tensorwatch as t ...
- 在 Docker 中手工部署 ASP.NET Core 应用
另一篇:在 Visual Studio 中部署 ASP.NET Core 应用 操作步骤 1. 安装 Docker For Windows(安装之前 Windows 需要开启 Hyper-V 虚拟机 ...
- 【转】MySQL中EXISTS的用法
原文链接:https://www.cnblogs.com/qlqwjy/p/8598091.html 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,Compan ...
- Tomcat报错:No result type specified for result named 'success'
今天学Struts, tomcat报出了异常信息 Exception starting filter [struts2] Unable to load configuration.还有 No resu ...
- Request部分知识点小结
HTTP: * 概念:Hyper Text Transfer Protocol 超文本传输协议 * 传输协议:定义了,客户端和服务器端通信时,发送数据的格式 * 特点: 1. 基于TCP/IP的高级协 ...
- 《The Google File System》 笔记
<The Google File System> 笔记 一.Introduction 错误是不可避免的,应当看做正常的部分而不是异常.因此需要设计持续监控,错误检查,容错,自动恢复的系统. ...
- 如何创建etcd双向通信证书
# 安装证书生成软件 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl wget https://pkg.cfss ...
- WUSTOJ 1308: 采药(Java)动态规划-01背包
题目链接: