顺序存储的栈

由于Python内置的列表是顺序存储的,所以我们直接使用列表作为顺序存储的栈的底层。具体代码如下:

class Stack(object):'实现顺序栈。'def __init__(self):'使用列表建立空栈。'self.items = []def IsEmpty(self):'方法:判断是否为空栈,返回布尔值。'if self.items == []:return Trueelse:return Nonedef size(self):'方法:返回栈的大小。'n = len(self.items)return ndef get_TopValue(self):'方法:访问栈顶元素。'if self.IsEmpty == True:return Noneelse:return self.items[-1]def push(self,item):'方法:压栈。'self.items.append(item)def pop(self):'方法:退栈。'self.items.pop()

简单测试:

my_stack = Stack()
print('my stack is empty?\n {}'.format(my_stack.IsEmpty()))#创建新栈并压入第一批元素:
[my_stack.push(i + 1) for i in range(10)]
print("now my stack's size is {}".format(my_stack.size()))
print("now my stack's top value is {}".format(my_stack.get_TopValue()))#进行压栈与退栈:
my_stack.push(11)
print("now my stack's top value is {}".format(my_stack.get_TopValue()))
my_stack.pop()
print("now my stack's top value is {}".format(my_stack.get_TopValue()))

测试结果:

my stack is empty?True
now my stack's size is 10
now my stack's top value is 10
now my stack's top value is 11
now my stack's top value is 10

可以看到我们的栈可以正常工作。


链式存储的栈

我们使用属性head代替指针指向栈顶,使用实例化Node类(由于Node类只在Stack类里使用,所以我们直接使用它暴露的属性而不定义其它方法)记录每一个节点的数据域data与指针域prev(指向前件),实现链式存储的栈,具体代码为

class Node(object):'定义节点。'def __init__(self):self.data = Noneself.prev = Noneclass Stack(object):'定义栈。'def __init__(self):'初始化一个空的栈顶元素'self.top = Noneself.size = 0def IsEmpty(self):'方法:判断栈是否为空。'if self.size == 0:return Trueelse:return Nonedef get_size(self):'方法:返回栈的大小。'return self.sizedef get_TopValue(self):'方法:访问栈顶元素。'if not self.IsEmpty():return self.top.dataelse:return Nonedef push(self,data):'方法:压栈。'node = Node()node.data = dataif self.IsEmpty == True:#此时压入的节点没有前件,其prev指针仍为None,只需将top指针指向当前节点即可。self.top = nodeelse:#此时压入的节点不是栈中的第一个元素,需要将其prev指针指向前件,并将top指针指向当前节点。node.prev = self.topself.top = nodeself.size += 1def pop(self):'方法:退栈。'if self.get_size() == 1:self.top = Noneself.size -= 1elif self.get_size() != 0:node = self.top.prevself.top = nodeself.size -= 1 else:raise IndexError('当前栈已经是空栈。')

简单测试:

my_stack = Stack()
print('my stack is empty?\n {}'.format(my_stack.IsEmpty()))#创建新栈并压入第一批元素:
[my_stack.push(i + 1) for i in range(10)]
print("now my stack's size is {}".format(my_stack.get_size()))
print("now my stack's top value is {}".format(my_stack.get_TopValue()))#进行压栈与退栈:
my_stack.push(11)
print("now my stack's top value is {}".format(my_stack.get_TopValue()))
my_stack.pop()
print("now my stack's top value is {}".format(my_stack.get_TopValue()))#进行11次退栈操作:
for i in range(11):print('第{}次:'.format(i + 1))my_stack.pop()print("now my stack's top value is {}".format(my_stack.get_TopValue()))

测试结果:

my stack is empty?True
now my stack's size is 10
now my stack's top value is 10
now my stack's top value is 11
now my stack's top value is 10
第1次:
now my stack's top value is 9
第2次:
now my stack's top value is 8
第3次:
now my stack's top value is 7
第4次:
now my stack's top value is 6
第5次:
now my stack's top value is 5
第6次:
now my stack's top value is 4
第7次:
now my stack's top value is 3
第8次:
now my stack's top value is 2
第9次:
now my stack's top value is 1
第10次:
now my stack's top value is None
第11次:
Traceback (most recent call last):File "带链的栈.py", line 88, in <module>my_stack.pop()File "带链的栈.py", line 69, in popraise IndexError('当前栈已经是空栈。')
IndexError: 当前栈已经是空栈。

说明我们定义的栈可以工作。

Python数据结构与算法基础|第二期:代码实现——栈的顺序存储与链式存储相关推荐

  1. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  2. 数据结构之顺序存储与链式存储

    数据结构之顺序存储与链式存储 定义 特点 前驱和后继 存储结构 顺序存储结构 定义 特点 优缺点 基本操作 链式存储结构 1.单链表 节点 基本操作 2.静态链表 3.双向链表 4.循环链表 顺序存储 ...

  3. python数据结构与算法知识点_数据结构和算法基础知识点(示例代码)

    数据结构和算法基础知识点 链表 1.链表是一种由节点组成的线性数据集合,每个节点通过指针指向下一个节点.它是 一种由节点组成,并能用于表示序列的数据结构. 2.单链表:每个节点仅指向下一个节点,最后一 ...

  4. Python数据结构与算法基础|第三期:代码实现——顺序存储队列与链式存储队列

    由于队列的动态由队头指针与队尾指针共同反映,所以我们在实现先入后出的同时还要实现队头元素与队尾元素的访问.对于普通的队列,我们使用列表实现其顺序存储,使用其它方法实现其链式存储. 顺序存储 由于我们使 ...

  5. Python数据结构与算法基础|第五期:代码实现——循环队列的链式存储结构

    在上一次,我们通过取余等数学方法实现了顺序存储的循环队列.由于我们使用的是Python内置的列表类型作为底层,实际上我们的存储空间并不是首尾相连的.下面,我们使用链式存储结构来实现一个真正首尾相连的循 ...

  6. 数据结构与算法2:线性表的顺序存储与链式存储

    文章目录 线性表 定义 线性表的抽象数据类型(Abstract Data Type) 线性表的顺序存储结构 线性表的链式存储结构 单链表(single linked list) 静态链表 (stati ...

  7. 数据结构与算法(6-2)二叉树的存储结构(顺序存储、链式存储)

    目录 一.二叉树的顺序存储 存储方式 总代码 二.二叉树的链式存储(二叉链表) 1.存储结构 2.创建二叉树 总代码 一.二叉树的顺序存储 存储方式 //树的顺序存储 typedef struct { ...

  8. 数据结构与算法实验 实验6:二叉树ADT的二叉链式实现 (由完全前序序列创建二叉树 / 求二叉树的节点数/树高/叶子节点数 /先序中序后序层序遍历)

    假设二叉数的数据元素为字符,采用二叉链式存储结构.请编码实现二叉树ADT,其中包括创建二叉树.遍历二叉树(深度.广度).求二叉树的深度(高度).计算二叉树的元素个数.计算二叉树的叶子数.二叉树的格式输 ...

  9. 【数据结构笔记05】堆栈及其顺序存储、链式存储

    本次笔记内容: 2.2.1 什么是堆栈 2.2.2 堆栈的顺序存储实现 2.2.3 堆栈的链式存储实现 2.2.4 堆栈的应用:表达式求值 文章目录 引:计算机如何进行表达式求值? 堆栈的抽象数据类型 ...

最新文章

  1. 数据科学究竟是什么?
  2. (深入理解)强化学习中on policy和off policy的区别
  3. C enum(枚举)
  4. python的工作方向-python工作方向,发展方向?
  5. Oracle inline view 简介
  6. 如何使用 tf object detection
  7. 关于numpy mean函数的axis参数
  8. python自学行吗-python能够自学吗
  9. JS调用OCX控件过程
  10. 计算机 随机分组的方法,临床试验中的随机分组方法.pdf
  11. 【札记】二 先天八卦与后天八卦
  12. 导向滤波与opencv python实现
  13. [javaSE] 基本类型(String相关)
  14. bugku writeup(misc_1)
  15. mac 电脑使用小鹤音形和小鹤双拼
  16. excel导入时手机号码格式错误的一个解决方法
  17. fastAPI简单使用
  18. gl-opendrive插件(车俩3D仿真模拟自动驾驶)
  19. 冯诺依曼原理计算机称为,冯·诺依曼提出的计算机工作原理又称为 工作原理。...
  20. STM32使用PA8测试系统时钟(LSE)

热门文章

  1. Lightweight Single-Image Super-Resolution Network with Attentive Auxiliary Feature Learning
  2. np.mat如何使用
  3. 12个固态硬盘优化技巧,延长固态硬盘使用寿命
  4. word行首空格下划线_行首空格和下划线问题的解决
  5. 正则表达式 行首行尾替换
  6. 重装系统之linux的ubuntu系统(服务器版)
  7. java中汉字自动转换成拼音
  8. python 通达信选股_大智慧公式转python,使用python在通达信里面选股
  9. 学计算机广告制作用什么电脑,大学设计专业电脑配置须知
  10. 【C语言】字符串的拷贝