本篇我以堆栈的数据类型和操作方法两个方面总结学习笔记

堆栈(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数据结构之堆栈的更多相关文章

  1. Python 数据结构_堆栈

    目录 目录 堆栈 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语: push: 意思是 ...

  2. python数据结构之栈与队列

    python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...

  3. [Python数据结构] 使用 Circular List实现Queue

    [Python数据结构] 使用 Circular List实现Queue 1. Queue队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体 ...

  4. [Python数据结构] 使用List实现Stack

    [Python数据结构] 使用List实现Stack 1. Stack 堆栈(Stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型(ADT),其特殊之处在于只能允许在阵列的一端进 ...

  5. Python - 数据结构 - 第十五天

    Python 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构. 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和 ...

  6. python语言的堆栈与队列类的实现

    基于python语言的数据结构之堆栈与队列的实现 # 堆栈的实现 # -*- coding: utf-8 -*- """ 栈(stack), 是一种容器,可以存入数据元素 ...

  7. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  8. python数据结构与算法——链表

    具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...

  9. python数据结构之图的实现

    python数据结构之图的实现,官方有一篇文章介绍,http://www.python.org/doc/essays/graphs.html 下面简要的介绍下: 比如有这么一张图: A -> B ...

随机推荐

  1. 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期

    7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...

  2. 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean

    7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...

  3. photoshop制作简单ico图标

    新建16 * 16透明画布 字体20px 半径4px

  4. Spring集成Mybatis,spring4.x整合Mybatis3.x

    Spring集成Mybatis,spring4.x整合Mybatis3.x ============================== 蕃薯耀 2018年3月14日 http://www.cnblo ...

  5. python3存入redis是bytes

    在python3 中使用redis存储数据,存进去的是bytes >>> import redis >>> import time >>> imp ...

  6. 探求C#.Net中ArrayList与Array的区别

     ArrayList与Array的区别概述     ArrayList 是数组的复杂版本.ArrayList 类提供在大多数 Collections 类中提供但不在 Array 类中提供的一些功能.例 ...

  7. VMware Workstation 14 黑屏的一个解决办法

    近期很多朋友遇到了VMware Workstation 14开启或新建虚拟机后黑屏的现象,同时发现如果挂起虚拟机,可以显示挂起前最后的画面.显然,虚拟机核心是正常工作的,只是“显示”方面出现了问题. ...

  8. thinkphp3.2 导航高亮显示

    Controller $action = CONTROLLER_NAME."/".ACTION_NAME; //获取当前页面的‘控制器/操作方法’: $this->assig ...

  9. 【node.js】Error: CERT_UNTRUSTED

    背景 : 在linux centos7 上 进行npm 命令是报错: Error: CERT_UNTRUSTED 解决办法: 关掉HTTPS就好了 npm config set strict-ssl ...

  10. 【分享】Linux(Ubuntu)下如何自己编译JDK

    最近在看<深入理解 Java 虚拟机>这本书.里面提到了如何手动编译JDK,于是就试了试. 在编译的过程中,遇到了一些问题.上网一搜,发现了一篇很好的文章,跟大家分享一下:ubuntu 1 ...