美文网首页Python
python-030-实现栈结构-用数组-适配器设计模式

python-030-实现栈结构-用数组-适配器设计模式

作者: DKider | 来源:发表于2019-04-17 20:25 被阅读2次

栈是最简单的数据结构,但也是最重要的数据结构。它出现在很多不同的应用中,在更复杂的数据结构和算法中充当工具。
从形式上,栈支持两种操作的抽象数据类型ADT,压栈和入栈:

  • S.push()
  • S.pop()
    此外,他还有以下方法:
  • S.top() 在不移除栈顶元素的前提下,返回栈顶元素,若栈为空,则报错。
  • S.is_empty() 如果栈中没有元素,返回True。
  • S.is_empty() 返回栈中元素的个数。
    初始化栈时,栈一半为空,且容量没有限制,栈元素可以是任意类型。

栈是一种先进后出的数据结构(Last In First Out)——LIFO。可以联想到python的列表,list.append()、list.pop(),是现成的方法。可以直接用。
有了以上信息,我们就可以开始着手实现一个栈类了。

这里涉及到一种设计模式——适配器模式。python的list类可以很方便的实现栈,所以我们通过改编它来实现。

适配器设计模式适用于任何上下文,可以使我们可以有效地使用一个现有的类,以使它的方法能够与那些与其相关但又不同的类或者接口相匹配。
通用的使用方法是将一个包含现存类作为一个新类的隐藏域,利用这个隐藏实例变量的方法实现新类的方法。
以这种方式应用适配器设计模式,我们已经创建了一个新类,可以执行一些现有类相同的方法,但是却用更加方便的方式进行封装。

改编列表类:

  • S.push(e) -------------->L.append(e)
  • S.pop(e) -------------->L.pop(e)
  • S.top() -------------->L[-1]
  • S.is_empty() -------------->len(L)==0
  • len(S) -------------->len(L)

我们先定义一个异常类用来说明栈中为空。

class Empty(Exception):
    """Error attempting to access an empty container"""
    pass

下面是栈类的代码:

class Empty(Exception):
    """Error attempting to access an empty container"""
    pass


class ArrayStack:
    """LIFO Stack using a python list"""
    def __init__(self):
        self._data = []

    def __len__(self):
        """返回栈中的元素个数"""
        return len(self._data)

    def is_empty(self):
        """如果栈为空,返回True"""
        return len(self._data) == 0

    def push(self, e):
        """压栈"""
        return self._data.append(e)

    def top(self):
        """返回栈顶元素,但不返回不弹栈"""
        if self.is_empty():
            raise Empty('Stack is empty!')
        return self._data[-1]

    def pop(self):
        """弹出栈顶元素,并返回这个元素"""
        if self.is_empty():
            raise Empty('Stack is empty!')
        return self._data.pop()

    def __str__(self):
        return str(self._data)


if __name__ == '__main__':
    # 调用这个栈
    s = ArrayStack()
    s.push(1)
    s.push(2)
    s.push(3)
    print(s)
    print('len(s)', len(s))
    print('s.top()',s.top())
    s.pop()
    print(s)
    print('s.pop()',s.pop())
    print('len(s)', len(s))
    s.push(5)
    s.push(9)
    print(s)
    print('len(s)', len(s))

我在最下面又加了str()方法,可以打印栈,可以方便我们做测试。

运行结果:

image.png

相关文章

  • python-030-实现栈结构-用数组-适配器设计模式

    栈是最简单的数据结构,但也是最重要的数据结构。它出现在很多不同的应用中,在更复杂的数据结构和算法中充当工具。从形式...

  • 最常用的设计模式---适配器模式(C++实现)

    适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。 适配器设计模式也并不复杂,适...

  • 关于栈的基础知识介绍

    一、存储结构 栈是一种线性结构:先进后出,可用数组与链表两种方式来实现。 1.数组栈 用数组来实现栈(此处用int...

  • 数据结构学习

    栈 先进先出的数据结构 接口api 接口抽象定义 异常类定义 用数组实现栈 用数组实现栈,这种方法存取数据在没有扩...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • [Python-设计模式] 结构型模式- 适配器模式

    适配器模式 适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。 适配器模式结构 对象适配器 实...

  • 【设计模式】结构型设计模式汇总

    结构型设计模式汇总 结构型设计模式名称 结构型设计模式主要包括 7 大类: 代理模式 桥接模式 装饰器模式 适配器...

  • 适配器模式

    目录 1、什么是适配器模式? 2、适配器模式结构? 3、如何实现适配器模式? 4、适配器模式的特点? 5、适配器模...

  • 51 - 适配器模式

    本文再来学习一个结构型设计模式:适配器模式,本文主要介绍它的两种实现方式,类适配器和对象适配器,以及 5 种常见的...

  • 用数组结构实现大小固定的栈和队列

    题目1: 用数组结构实现大小固定的栈 思路: 栈:栈是后进先出的,所以定义一个变量size用来记数组下标,入栈就是...

网友评论

    本文标题:python-030-实现栈结构-用数组-适配器设计模式

    本文链接:https://www.haomeiwen.com/subject/gokowqtx.html