python中栈的单链表实现

时间:2021-12-02 08:58:46

参考博客:https://www.cnblogs.com/stacklike/p/8284550.html

基于列表的简单实现

# 先进后出
# 以列表实现的简单栈
class SimpleStack:
# 特殊属性,用以限制class可添加的属性
__slots__ = ('__items',) def __init__(self):
self.__items = [] def is_empty(self):
return self.__items == [] def peek(self):
return self.__items[len(self.__items)-1] def size(self):
return len(self.__items) def push(self, item):
self.__items.append(item) def pop(self):
self.__items.pop()

以单链表的形式实现栈

class StackFullException(Exception):  # 满栈时要抛出的异常
pass class StackEmptyException(Exception): # 空栈时要抛出的异常
pass class Node:
def __init__(self, val=None, nxt=None):
self.value = val # 信息域
self.next = nxt # 指针域 def __str__(self):
return str(self.value) class Stack:
# 初始化一个空栈
def __init__(self, max=0):
self._top = None # 栈的顶部元素
self._max = 0 # 栈的最大高度
self.max = max # 用户将设置的最大栈高度 @property
def length(self):
if self._top is None:
return 0
node = self._top
count = 1 # 只要不为空,就至少有一个节点,因此由1开始
# 借由节点内的指针来判断是否有下一个元素,只要就由当前节点跳到下一个节点,并将计数加1
while node.next:
node = node.next
count += 1
return count @property
def is_empty(self):
return self._top is None @property
def is_full(self):
# 满栈的条件是栈的最大高度不是无限的(设置最大值时会将负数也转为0,0就代表了无限大小)
# 而且当前栈高等于允许的最大栈高
return bool(self._max and self.length == self._max) @property
def max(self):
return self._max @max.setter
def max(self, m):
m = int(m) # 可能传入值是str或float
if m < self.length: # 设置值是否小于当前栈的高度,是则要抛出异常
raise Exception('Stack resize failed, please pop some elements first.')
self._max = 0 if m < 0 else m # 输入值又是否是负数或0,是则都设置为0,当作无限大小 # 通过逐个压入传入的iterable,由空栈构建出一个栈
def init(self, iterable=()):
if not iterable: # 传入一个可迭代对象
return
self._top = Node(iterable[0]) # 将其起始元素设置为栈顶
for item in iterable[1::]: # 将之后的元素也依次压入栈中,每一次压入栈定元素都会被替换
node = self._top # 原栈顶元素先储存起来
self._top = Node(item) # 将当前元素设置为栈顶
self._top.next = node # 将设置过的栈定的指针指向原来的栈顶 """
| 5 |
| 4 |
| 3 |
| 2 |
| 1 | 显示的样板
"""
def show(self):
# 定义的子函数是为了遍历栈,这里用到了生成器
def _traversal(self):
node = self._top
while node and node.next:
yield node
node = node.next
# 这里如果不yield,则栈底的元素会无法被遍历到,因为最后一个元素并不满足while循环的条件,会中止迭代
yield node
# <>^ 左/右/居中对齐
# 生成器也是可迭代的,这里用高阶函数将字符串格式方法映射到每一个元素上
print('\n'.join(map(lambda x: '|{:^7}|'.format(str(x)), _traversal(self))) + '\n ' + 7 * '-') def push(self, item):
# 如果栈已满,则抛出异常
if self.is_full:
raise StackFullException('Error: trying to push an item into a full stack.')
# 如果栈是空的,则直接将item设置为栈顶,返回即可,因为不需要设置指针
if not self._top:
self._top = Node(item)
return
node = self._top # 先取到原栈顶
self._top = Node(item) # 设置item为栈顶
self._top.next = node # 将设置过的栈顶的指针指向原栈顶 def pop(self):
if self.is_empty:
raise StackEmptyException('Error: trying to pop from an empty stack.')
node = self._top # 先取到原栈顶
self._top = self._top.next # 将栈顶设置为原栈顶的下一个元素
return node.value # 返回原栈顶的值 def top(self):
return self._top.value if self._top else None def clear(self): # 在已构造的方法上再构造新方法
while self._top:
self.pop() s = Stack()
s.init([1, 2, 3, 4, 5])
s.show()

python中栈的单链表实现的更多相关文章

  1. python中栈的实现

    栈是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,栈中数据的插入删除操作都是在栈顶端进行,常见栈的函数操作包括 empty() – 返回栈是否为空 – Time Complexity : ...

  2. python算法与数据结构-单链表&lpar;38&rpar;

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  3. C语言 - 栈和单链表的实现

    单链表:linkList.h linkList.c #ifndef LINKLIST_H_INCLUDE #define LINKLIST_H_INCLUDE #include <Windows ...

  4. python中的数据结构-链表

    一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环 ...

  5. C&num;中泛型和单链表

      泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能.泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类 ...

  6. Javascript - 栈 和 单链表

    最近在重温数据结构,于是写了一些代码玩玩,都是很初级的,表喷各位.... function Stack() { this.dataStore = []; this.top = 0; } Stack.p ...

  7. python实现一个无序单链表

    class Node: """先定一个node的类""" def __init__(self, value=None, next=None) ...

  8. Python实现栈、队列

    目录 1. 栈的Python实现 1.1 以列表的形式简单实现栈 1.2 以单链表形式实现栈 2. 队列的Python实现 2.1 以列表实现简单队列 2.2 以单链表形式实现队列   本文将使用py ...

  9. java单链表常用操作

    总结提高,与君共勉 概述. 数据结构与算法亘古不变的主题,链表也是面试常考的问题,特别是手写代码常常出现,将从以下方面做个小结 [链表个数] [反转链表-循环] [反转链表-递归] [查找链表倒数第K ...

随机推荐

  1. 完整记录一则Oracle 11&period;2&period;0&period;4单实例打PSU补丁的过程

    本文记录了打PSU的全过程,意在体会数据库打PSU补丁的整个过程. 1.OPatch替换为最新版本2.数据库软件应用19121551补丁程序3.数据库应用补丁4.验证PSU补丁是否应用成功 1.OPa ...

  2. OpenSuse Caffe CNN库 配置

    参考官方文档:http://caffe.berkeleyvision.org/installation.html 1. 安装CUDA 参考 http://www.cnblogs.com/sunshy/ ...

  3. Tomcat 生产服务器性能优化

    虑一下这种场景,你开发了一个应用,它有十分优秀的布局设计,最新的特性以及其它的优秀特点.但是在性能这方面欠缺,不管这个应用如何都会遭到客户拒绝.客户总是期望它们的应用应该有更好的性能.如果你在产品中使 ...

  4. SqlServer2008 数据库同步的两种方式 &lpar;发布、订阅&rpar;

    尊重原著作:本文转载自http://www.cnblogs.com/tyb1222/archive/2011/05/31/2064944.html 上篇中说了通过SQL JOB的方式对数据库的同步,这 ...

  5. S性能 Sigmoid Function or Logistic Function

    S性能 Sigmoid Function or Logistic Function octave码 x = -10:0.1:10; y = zeros(length(x), 1); for i = 1 ...

  6. LCD开发之汉字显示

    一.LCD显示原理 利用液晶制成的显示器称为LCD,根据驱动方式可分为静态驱动.简单矩阵驱动以及主动矩阵驱动3种.当中,简单矩阵型又可再细分扭转向列型(TN)和超扭转式向列型(STN)两种,而主动矩阵 ...

  7. activiti工作流框架简介

    常见的工作流框架:activiti, JBPM, OSWorkflow activiti框架基于23张基础的表数据, 基于Mybatis操作数据库. JBPM框架基于18张基础的表数据, 基于hibe ...

  8. Python find函数用法和概念

    概念: Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返 ...

  9. centos7下kubernetes(2。kubernetes---start,重要概念)

    Cluster cluster是计算,存储和网络资源的集合,kubernetes是利用这些资源运行各种基于容器的应用 Master Master是cluster的大脑,他的主要职责是调度,即决定应用在 ...

  10. sysstat-----获取服务器负载历史记录

    sysstat工具与负载历史回放 很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来 ...