python数据结构之堆栈
本篇我以堆栈的数据类型和操作方法两个方面总结学习笔记
堆栈(Stack)
- 一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行。
- 堆栈可以通过数组和链表轻松实现
一、数据类型

Stack()创建堆栈push(item)向栈顶插入项(平时的insert) / append()(内置)pop()返回栈顶的项(内置),并从堆栈中删除该项(平时的remove)clear()清空堆栈empty()判断堆栈是否为空size()返回堆栈中项的个数top()返回栈顶的项
操作示意图

二、代码实现
下面以数组和链表两个方面写出实现代码。时间复杂度分析如下
- 动态数组插入前面O(n),插入后面0(1)
- 链表插入前面O(1),插入后面O(n)
- 所以堆栈为了达到0(1)的效果:数组堆到后面,链表插到前面
'''
动态数组堆栈(Array Stack)
堆栈的数组实现插到数组后面,因此基本都是对最后一个元素进行操作
'''
class ArrayStack(object):
def __init__ (self):
self._data = [] #空的容器 def __len__ (self): #size
return len(self._data) def is_empty(self):
return len(self._data) == 0 #push进堆栈: O(1)
def push(self, e):
self._data.append(e) # 查看栈顶元素:O(1)
def top(self):
if self.is_empty( ):
raise ValueError( 'Stack is empty' )
return self._data[-1] # 弹出栈顶元素O(1)
def pop(self):
if self.is_empty( ):
raise ValueError( 'Stack is empty' )
return self._data.pop( ) #打印堆栈
def printstack(self):
for i in range(len(self._data)):
print(self._data[i], end = ' ')
print() mystack = ArrayStack()
print ('size was: ', str(len(mystack)))
mystack.push(1)
mystack.push(2)
mystack.push(3)
mystack.push(4)
mystack.push(5)
print ('size was: ', str(len(mystack)))
mystack.printstack()
mystack.pop()
mystack.pop()
print ('size was: ', str(len(mystack)))
mystack.printstack()
print(mystack.top())
mystack.pop()
mystack.pop()
mystack.pop() #输出结果
size was: 0
size was: 5
1 2 3 4 5
size was: 3
1 2 3
3
'''
链表(Linked List)
堆栈的链表实现插到元素前面,因此都是对第一个节点进行操作
下面模块导入自我的链表学习笔记代码
'''
from LinkedList import LinkedList
from LinkedList import Node class LinkedStack(object):
def __init__ (self):
self._list = LinkedList() def __len__ (self):
return self._list.length def is_empty(self):
return self._list.length == 0 # O(1)
def push(self, e):
self._list.add_first(e); # O(1)
def top(self):
return self._list.get_first().value; # O(1)
def pop(self):
return self._list.remove_first().value; def printstack(self):
self._list.printlist() mystack = LinkedStack()
print ('size was: ', str(len(mystack)))
mystack.push(1)
mystack.push(2)
mystack.push(3)
mystack.push(4)
mystack.push(5)
print ('size was: ', str(len(mystack)))
mystack.printstack()
mystack.pop()
mystack.pop()
print ('size was: ', str(len(mystack)))
mystack.printstack()
print(mystack.top())
mystack.pop()
mystack.pop()
mystack.pop() #输出结果
size was: 0
size was: 5
5 4 3 2 1
size was: 3
3 2 1
3
python数据结构之堆栈的更多相关文章
- Python 数据结构_堆栈
目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...
- python数据结构之栈与队列
python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...
- [Python数据结构] 使用 Circular List实现Queue
[Python数据结构] 使用 Circular List实现Queue 1. Queue队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体 ...
- [Python数据结构] 使用List实现Stack
[Python数据结构] 使用List实现Stack 1. Stack 堆栈(Stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型(ADT),其特殊之处在于只能允许在阵列的一端进 ...
- Python - 数据结构 - 第十五天
Python 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构. 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和 ...
- python语言的堆栈与队列类的实现
基于python语言的数据结构之堆栈与队列的实现 # 堆栈的实现 # -*- coding: utf-8 -*- """ 栈(stack), 是一种容器,可以存入数据元素 ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- python数据结构与算法——链表
具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...
- python数据结构之图的实现
python数据结构之图的实现,官方有一篇文章介绍,http://www.python.org/doc/essays/graphs.html 下面简要的介绍下: 比如有这么一张图: A -> B ...
随机推荐
- Java -- Java 类集 -- 目录
13.1 认识类集 13.1.1 基本概念 13.1.2 类集框架主要接口 13.2 Collection接口 13.2.1 Collection接口的定义 13.2.2 Collection子接口的 ...
- Hibernate的Configuration和SessionFactiory
Configuration: Configuration是hibernate的入口,负责管理Hibernate的配置信息,这些配置信息都是从配置文件hibernate.cfg.xml或者Hiberna ...
- ajax简单手写了一个猜拳游戏
使用ajax简单写一个猜拳游戏 HTML代码 <!DOCTYPE HTML> <html lang="en-US"> <head> <me ...
- MySQL 安装与配置
Linux 安装 MySQL Windows 安装 MySQL 如何连接 MySQL 如何修改 MySQL 密码 如何重置 MySQL 密码
- 判断App整体处于前台还是后台
1.通过RunningTaskInfo类判断(需要额外权限): 复制代码代码如下: /** *判断当前应用程序处于前台还是后台 */ public static boolean isApplicati ...
- python3.4连接和读取oracle数据表
想用python连接Oracle并查询数据表,就写了个Demo.参考了以下网址. Python学习之 cx_Oracle学习记录 一 http://my.oschina.net/bxxfighting ...
- C++ template —— 模板中的名称(三)
第9章 模板中的名称------------------------------------------------------------------------------------------ ...
- 使用jsp实现文件上传的功能
首先是表单的jsp文件:upload.jsp <%@ page contentType="text/html;charset=UTF-8" language="ja ...
- setcursor 与 showcursor
Windows为鼠标光标保存了一个「显示计数」.如果安装了鼠标,显示计数会被初始化为0:否则,显示计数会被初始化为-1. 只有在显示计数非负时才显示鼠标光标.要增加显示计数,呼叫:ShowCursor ...
- iOS - UICollectionView 瀑布流 添加表头视图的坑
UICollectionView 瀑布流 添加表头视图的坑 首先是,需求加了个头视图在顶部,在collectionView中的头视图跟TableView的不一样,TableView的表头只要设置tab ...