Python实现栈的方法详解【基于数组和单链表两种方法】


Posted in Python onFebruary 22, 2020

本文实例讲述了Python实现栈的方法。分享给大家供大家参考,具体如下:

前言

使用Python 实现栈。
两种实现方式:

  • 基于数组 - 数组同时基于链表实现
  • 基于单链表 - 单链表的节点时一个实例化的node 对象

完整代码可见GitHub:
https://github.com/GYT0313/Python-DataStructure/tree/master/5-stack

目录结构:
Python实现栈的方法详解【基于数组和单链表两种方法】
注:一个完整的代码并不是使用一个py文件,而使用了多个文件通过继承方式实现。

1. 超类接口代码

arraycollection.py

"""
File: abstractcollection.py
Author: Ken Lambert
"""

class AbstractCollection(object):
  """An abstract collection implementation."""

  # Constructor
  def __init__(self, sourceCollection = None):
    """Sets the initial state of self, which includes the
    contents of sourceCollection, if it's present."""
    self._size = 0
    if sourceCollection:
      for item in sourceCollection:
        self.add(item)

  # Accessor methods
  def isEmpty(self):
    """Returns True if len(self) == 0, or False otherwise."""
    return len(self) == 0
  
  def __len__(self):
    """Returns the number of items in self."""
    return self._size

  def __str__(self):
    """Returns the string representation of self."""
    return "[" + ", ".join(map(str, self)) + "]"

  def __add__(self, other):
    """Returns a new bag containing the contents
    of self and other."""
    result = type(self)(self)
    for item in other:
      result.add(item)
    return result

  def __eq__(self, other):
    """Returns True if self equals other,
    or False otherwise."""
    if self is other: return True
    if type(self) != type(other) or \
      len(self) != len(other):
      return False
    otherIter = iter(other)
    for item in self:
      if item != next(otherIter):
        return False
    return True

abstractstack.py

"""
File: abstractstack.py
Author: Ken Lambert
"""

from abstractcollection import AbstractCollection

class AbstractStack(AbstractCollection):
  """An abstract stack implementation."""

  # Constructor
  def __init__(self, sourceCollection = None):
    """Sets the initial state of self, which includes the
    contents of sourceCollection, if it's present."""
    AbstractCollection.__init__(self, sourceCollection)

  # Mutator methods
  def add(self, item):
    """Adds item to self."""
    self.push(item)

2. 基于数组

运行示例:
Python实现栈的方法详解【基于数组和单链表两种方法】
代码:
栈实现:arraystack.py

"""
File: abstractstack.py
Author: Ken Lambert
"""

from abstractcollection import AbstractCollection

class AbstractStack(AbstractCollection):
  """An abstract stack implementation."""

  # Constructor
  def __init__(self, sourceCollection = None):
    """Sets the initial state of self, which includes the
    contents of sourceCollection, if it's present."""
    AbstractCollection.__init__(self, sourceCollection)

  # Mutator methods
  def add(self, item):
    """Adds item to self."""
    self.push(item)

数组实现:arrays.py

"""
File: arrays.py

An Array is a restricted list whose clients can use
only [], len, iter, and str.

To instantiate, use

<variable> = array(<capacity>, <optional fill value>)

The fill value is None by default.
"""

class Array(object):
  """Represents an array."""

  def __init__(self, capacity, fillValue = None):
    """Capacity is the static size of the array.
    fillValue is placed at each position."""
    self._items = list()
    for count in range(capacity):
      self._items.append(fillValue)

  def __len__(self):
    """-> The capacity of the array."""
    return len(self._items)

  def __str__(self):
    """-> The string representation of the array."""
    return str(self._items)

  def __iter__(self):
    """Supports iteration over a view of an array."""
    return iter(self._items)

  def __getitem__(self, index):
    """Subscript operator for access at index."""
    return self._items[index]

  def __setitem__(self, index, newItem):
    """Subscript operator for replacement at index."""
    self._items[index] = newItem

3. 基于链表

运行示例:
Python实现栈的方法详解【基于数组和单链表两种方法】
代码:
linkedstack.py

"""
linkedstack.py
"""

from node import Node
from abstractstack import AbstractStack

class LinkedStack(AbstractStack):
  """基于单链表实现栈-链表头部为栈顶"""

  def __init__(self, source_collection=None):
    self._items = None
    AbstractStack.__init__(self, source_collection)

  def __iter__(self):
    """迭代-使用一个列表实现, 列表第一项为单链表的最后一项"""
    def visit_nodes(node):
      if node != None:
        visit_nodes(node.next)
        temp_list.append(node.data)
    temp_list = []
    visit_nodes(self._items)
    return iter(temp_list)

  def peek(self):
    """返回栈顶元素"""
    self._prior_condition()
    return self._items.data

  def clear(self):
    """清空列表"""
    self._size = 0
    self._items = None

  def push(self, item):
    """入栈"""
    self._items = Node(item, self._items)
    self._size += 1

  def pop(self):
    """出栈"""
    self._prior_condition()
    old_item = self._items.data
    self._items = self._items.next
    self._size -= 1
    return old_item

  def _prior_condition(self):
    if self._size == 0:
      raise KeyError("The stack is empty.")

node.py

"""
链表结构的节点类
"""

class Node(object):
  def __init__(self, data, next=None):
    self.data = data
    self.next = next

参考:《数据结构(Python语言描述)》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python Queue模块详解
Nov 30 Python
Python获取网页上图片下载地址的方法
Mar 11 Python
python妙用之编码的转换详解
Apr 21 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
python实现删除列表中某个元素的3种方法
Jan 15 Python
python实现人机五子棋
Mar 25 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
分享python函数常见关键字
Apr 26 Python
Python栈的实现方法示例【列表、单链表】
Feb 22 #Python
python实现滑雪者小游戏
Feb 22 #Python
python实现拼图小游戏
Feb 22 #Python
Python双链表原理与实现方法详解
Feb 22 #Python
Python单链表原理与实现方法详解
Feb 22 #Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 #Python
python通过文本在一个图中画多条线的实例
Feb 21 #Python
You might like
用PHP实现验证码功能
2006/10/09 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
php微信开发之图片回复功能
2018/06/14 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
JavaScript 变量作用域分析
2011/07/04 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
微信小程序实现弹出菜单功能
2018/06/12 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
python实现桌面壁纸切换功能
2019/01/21 Python
Python自动化运维之Ansible定义主机与组规则操作详解
2019/06/13 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
任意存:BOXFUL
2018/05/21 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
电脑教师的自我评价
2013/12/18 职场文书
2014年元旦活动方案
2014/02/15 职场文书
庆祝国庆节演讲稿2014
2014/09/19 职场文书
车辆转让协议书
2014/09/24 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers