双端循环列表实现栈(python)
- # -*- coding: utf-8 -*-
- from collections import deque
- class Node(object):
- def __init__(self, value=None, prev=None, next=None):
- self.value, self.prev, self.next = value, prev, next
- class CircularDoubleLinkedList(object):
- def __init__(self, maxsize=None):
- self.maxsize = maxsize
- 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.maxsize is not None and len(self) >= self.maxsize:
- raise Exception('LinkedList is Full')
- node = Node(value=value)
- tailnode = self.tailnode() or self.root
- tailnode.next = node
- node.prev = tailnode
- node.next = self.root
- self.root.prev = node
- self.length += 1
- def appendleft(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 = 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):
- 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 Deque(CircularDoubleLinkedList):
- def pop(self):
- """删除尾节点"""
- if len(self) == 0:
- raise Exception('empty')
- tailnode = self.tailnode()
- value = tailnode.value
- self.remove(tailnode)
- return value
- def popleft(self):
- if len(self) == 0:
- raise Exception('empty')
- headnode = self.headnode()
- value = headnode.value
- self.remove(headnode)
- return value
- def test_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) == 0
- class Stack(object):
- def __init__(self):
- self.deque = Deque()
- def push(self, value):
- self.deque.append(value)
- def pop(self):
- return self.deque.pop()
- class Stack2(object):
- def __init__(self):
- self._deque = deque()
- def push(self, value):
- return self._deque.append(value)
- def pop(self):
- return self._deque.pop()
- def empty(self):
- return len(self._deque) == 0
- def test_stack():
- s = Stack()
- s.push(0)
- s.push(1)
- s.push(2)
- assert s.pop() == 2
- assert s.pop() == 1
- assert s.pop() == 0
- import pytest # pip install pytest
- with pytest.raises(Exception) as excinfo:
- s.pop()
- assert 'empty' in str(excinfo.value)
- if __name__ == '__main__':
- test_stack()
双端循环列表实现栈(python)的更多相关文章
- 22.1.23Manacher算法、双端队列、单调栈
22.1.23Manacher算法.双端队列.单调栈 1.Manacher算法 1)用途: Manacher算法用于解决类似求某个字符串中最长的回文子串.(回文就是正着读和倒着读一样的结构). 2)算 ...
- pta6-15(双端循环队列)
题目链接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101313244863737856 题意:实现双段队列的队首出队. ...
- PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)
1074 Reversing Linked List (25 分) Given a constant K and a singly linked list L, you are supposed ...
- 双端队列-deque【集vector与list于一身的牺牲内存换功能完善】
看到双端队列(deque)了,书上是这样说的:除了栈和队列外还有一种限定性数据结构是双端队列:双端队列是限定插入和删除操作在表的两端进行的线性表:尽管双端队列看起来似乎比栈和队列更灵活,但实际上在应用 ...
- python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表
目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...
- 用python实现栈/队列/双端队列/链表
栈是元素的有序集合,添加操作与移除操作都发生在其顶端,先进后出栈操作:创建空栈,增删(顶端),查(顶端元素,元素个数,是否为空)应用:将十进制数转换成任意进制数 class Stack: # 用列表创 ...
- 循环双端链表(python)
# -*- coding: utf-8 -*- class Node(object): __slots__ = ('value', 'prev', 'next') # save memory def ...
- 06.队列、python标准库中的双端队列、迷宫问题
class QueueUnderflow(ValueError): """队列为空""" pass class SQueue: def __ ...
- python中使用双端队列解决回文问题
双端队列:英文名字:deque (全名double-ended queue)是一种具有队列和栈性质的抽象数据类型. 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行. 双端队列可以在 ...
随机推荐
- 10点睛Spring MVC4.1-全局异常处理
10.1 全局异常处理 使用@ControllerAdvice注解来实现全局异常处理; 使用@ControllerAdvice的属性缩小处理范围 10.2 演示 演示控制器 package com.w ...
- ovs 数据包的处理过程
Openvswitch的内核模块openvswitch.ko会在网卡上注册一个函数netdev_frame_hook,每当有网络包到达网卡的时候,这个函数就会被调用. static struct sk ...
- Centos7.0操作系统加固常见方法
1. 账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险. 操作步骤 使用命令 userdel <用户名> 删除不必要的账号. 使用命令 passwd -l <用 ...
- 高级UI-CardView
CardView是在Android 5.0推出的新控件,为了兼容之前的版本,将其放在了v7包里面,在现在扁平化设计潮流的驱使下,越来越多的软件使用到了CardView这一控件,那么这篇文章就来看看Ca ...
- Actor模型的状态(State)+行为(Behavior)+邮箱(Mailbox)
状态(State)+行为(Behavior)+邮箱(Mailbox) 基于Actor模型的CQRS.ES解决方案分享 开场白 大家晚上好,我是郑承良,跟大家分享的话题是<基于Actor模型的CQ ...
- php面相对象基本概念,基本形式,传值
面向对象基本概念 面向对象三大特性:封装 继承 多态 类与对象 类:是用于描述“某一些具有共同特征”的物体的概念,是某一类物体的总称. 通常,一个类所具有的共同特征包括2大方面的信息: 外观,形状 ...
- Google BERT
概述 BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不 ...
- linux中硬盘分区、格式化、挂载
已经接触了小半年的linux,基本命令用的还行,就是涉及到深入操作,就显得不够看了,比如linux中的硬盘操作,于是整理了这篇博客. 1. 主分区,扩展分区,逻辑分区的联系和区别 一个硬盘可以有1 ...
- conda 创建tensorflow虚拟环境后,无法import tensorflow在jupyter
ensorflow安装好了,在python中也测试过了,但在jupyter中却会报错,原因是先装的Anaconda 之后装的tensorflow,所以环境有问题,所以需要重装jupyter,先激活te ...
- [PDF] - 获取 RadioButtonList 控件值的方法
背景 目标是通过 iTextSharp 读取 PDF 模板,填充内容后以生成新 PDF 文件.利用 福昕PDF编辑器个人版 可以获取到 RadioButtonList 的组名,但是获取不到每一个 Ra ...