下压栈(或简称栈)是一种基于后进后出的(LIFO)策咯的集合类型.

其中添加移除新项总发生在同一端。这一端通常称为“顶部”。与顶部对应的端称为“底部”。栈的例子很常见,想象桌上有一堆书., 只有顶部的那本书封面可见,要看到其他书的封面,只有先移除他们上面的书.

image

下图反应了栈中数据加入和移走的顺序:

image

栈的抽象数据类型

一个栈一般会实现以下方法:

Stack() 构造方法,创建一个空栈,无参数,返回值是空栈

push(value) 向栈顶压入一个新数据项,需要一个数据项参数,无返回值

pop() 抛出栈顶数据项,无参数,返回被抛出的数据项,栈本身发生变化

is_empty() 测试栈是否空栈。不需要参数,返回布尔值

size() 返回栈内数据项的数目,不需要参数,返回值是整数

peak() 返回栈顶数据项,但不删除。不需要参数,栈不变

栈的python实现(一)

利用.append与.pop方法,我们可以把python内置的列表当作栈来使用(栈是一种特殊的列表),这是一种较为方便的实现方式

class Stack:

def __init__(self):

self.values = []

def push(self, value):

self.values.append(value)

def pop(self):

return self.values.pop()

def is_empty(self):

return self.size() == 0

def size(self):

return len(self.values)

def peak(self):

return self.values[self.size()-1]

栈的python实现(二)

或者自由定义类似列表的Stack类

class Node: ➊

def __init__(self, value):

self.value = value

self.next = None

class Stack: ➋

def __init__(self):

self.top = None

def push(self, value):

node = Node(value)

node.next = self.top

self.top = node

def pop(self):

node = self.top

if node is None:

raise Exception('This is an empty stack')

self.top = node.next

return node.value

def peek(self):

node = self.top

if node is None:

raise Exception('This is an empty stack')

return node.value

def is_empty(self):

return not self.top

def size(self):

node = self.top

count = 0

if node is None:

raise Exception('This is an empty stack')

while node is not None:

count += 1

node = node.next

return count

if __name__ == '__main__':

stack = Stack()

stack.push(2)

stack.push(3)

# print(stack.pop())

# print(stack.top.value)

print(stack.peek())

print(stack.is_empty())

print(stack.size())

➊ 定义一个结点

image

➋ 定义一个栈

image

top指向栈顶的Node,next之想下一个Node,若没有下一个Node,则指向一个None

栈的应用

十进制转二进制 是一个应用堆栈的典型案例。十进制转二进制 采用“除2取余,逆序排列”的方法,如图所示:

image

借助Stack类,可以很方便地实现上述转换算法:

def divideBy2(decNumber):

remstack = Stack()

while decNumber > 0:

rem = decNumber % 2

# 将余数逐个加入

remstack.push(rem)

decNumber = decNumber // 2

binString = ""

while not remstack.is_empty():

binString = binString + str(remstack.pop())

return binString

if __name__ == '__main__':

print(divideBy2(42))

运行结果:

$ python dec2bin.py

101010

相关链接

python定义栈_Python栈实现相关推荐

  1. python实现栈_Python 栈

    栈抽象数据类型由下面的结构和操作定义.栈是元素的有序集合,添加操作与移除操作都发生在其顶端.栈的操作顺序是 LIFO,它支持以下操作: Stack() 创建一个空栈.它不需要参数,且会返回一个空栈. ...

  2. python定义整数_Python | 程序定义一个整数值并打印

    python定义整数 Define an integer value in a variable and print it in Python. 在变量中定义一个整数值,然后在Python中打印出来. ...

  3. python定义词典_python – 自定义类是一个字典,但初始化没有字典副本?

    出于易读性的目的,我希望有一个自定义类,其行为与dict完全相同(但是带有有意义的类型,而不是更通用的dict类型): class Derivatives(dict): "Dictionar ...

  4. python定义符号常量_python注释、变量、常量的学习

    注释.变量.常量的学习 注释 什么是注释 注释是对代码的解释,方便后期的阅读代码,可以使在后期的代码维护中事半功倍. 注释的作用 注释可以用来排查代码中的BUG,在一段有BUG的代码当中,用注释选中其 ...

  5. python 定义数字_Python:已定义数字列表的差异

    我正在尝试创建一个打印已定义数字列表的方差的函数: grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5] 到目前为止,我 ...

  6. python定义符号常量_python从零开始学习(二):python中的变量与常量

    一.python变量与常量里的定义 变量:在内存中开辟一块区域,储存值,可以理解为给值起一个名字.例子 a=1,a就是变量,1就是值 常量:程序运行中不会改变的值,大部分情况和变量一起使用. 例子  ...

  7. python定义集合_Python - 集合

    在数学上,一组是不以任何特定顺序的项目的集合.Python集合与此数学定义类似,但有以下附加条件. 该集合中的元素不能重复. 该集合中的元素是不可变的(不能被修改),但集合作为一个整体是可变的. 没有 ...

  8. python定义变量_Python基础 变量的基本使用

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...

  9. [转载] python定义整型常量_Python笔记——数据类型、变量和常量

    参考链接: Python变量,常量和文字 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频 ...

最新文章

  1. constructor
  2. mysql_safe后重启_mysql无限重启是什么情况
  3. 第6章 C控制语句:循环
  4. centos下resin4启动一会儿自动关闭处理
  5. C++ Primer 第11章 泛型算法 学习总结
  6. 文件I/O实践(3) --文件共享与fcntl
  7. Golang 标准库--strings
  8. Oracle 数据库的基本用法
  9. HDU 1576 A/B(数论简单题,求逆元)
  10. 对Javascript的原型,原型链和继承的个人理解
  11. DPDK初始化分析(二)
  12. HTML和Jsp 页面使用 shiro标签备忘录
  13. mysql oracle视频网盘_动力节点MySQL数据库视频 百度云 网盘 下载
  14. VC编程--玩转控件(Windows编程简介)
  15. 华为会强迫升级鸿蒙,华为手机升级鸿蒙系统好用吗
  16. **matlab中grid、grid on 和grid off用法**
  17. 基于python爬虫下载网站在线视频
  18. 空军资深战略研究员:房地产支撑不起大国崛起
  19. 从零开始安装Gentoo
  20. ROM、PROM、EPROM、EEPROM、Flash ROM分别指什么?

热门文章

  1. 【原创】Linux基础之去掉windows中的\r
  2. HDU3507-Print Article-斜率dp入门题
  3. sql 排序 分组 层级 筛选 - God聚会啊
  4. 无限分级 层次输出 demo
  5. 面向接口编程 (噬菌体) 不错的接口
  6. 用学生编程记录预测学习成果,第二届计算机教育数据挖掘大赛, 赢取现金奖励+顶刊发表机会!...
  7. 大数据“高烧不断”,“得数据者得天下”的关键在哪?
  8. 机器学习的下一站:AutoML | 文末送书
  9. 3D重建传统算法对比深度学习,SFU谭平:更需要的是二者的融合
  10. mysql less6教程_Sqli labs系列-less-56 报错注入法(上)