欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python进阶之数据结构与算法--入门-利用列表实现栈(小白piao分享)

程序员文章站 2022-07-14 19:00:04
...

概念:

    栈:

        名称的由来:这个名字来源于自动售货机中用弹簧顶住的一堆盘子的隐喻。
        概念:这里提到的栈是一种抽象的数据结构,而非空间内存分配处涉及的空间存储的概念。但是大同小异,原理还是来自于对栈空间的理解。这里的栈是有一系列对象组成的一个集合,这些对象的插入和删除操作遵循后进先出(LIFO)原则。用户可以在任意时刻向栈中插入一个对象,但只能取得或者删除最后一个插入的对象(即所谓的栈顶)。

目的:通过列表实现栈

class ArrayStack:
    def __init__(self):
        self._data = []
    def __len__(self):
        return len(self._data)

    def top(self):# 查询栈顶
        if self.is_empty():
            raise TypeError('Stack is empty')
        return self._data[-1]
    def is_empty(self):# 判空
        return len(self._data)==0
    def push(self,var):# 压栈
        self._data.append(var)
    def pop(self):
        if self.is_empty():# 为空时抛出异常,不能进行出栈操作
            raise TypeError('Stack is empty')
        return self._data.pop()

         有些同学可能认为,是不是还有其他操作没有完成,为什么不能在中间插入或者其他操作,因为栈不具备这些功能,所以实现的都是栈的常规功能。

利用栈实现数据的逆置

        由于LIFO协议的限制,栈可以用作一种通用的工具,用于实现一个数据序列的逆置,这一思想可以用于很多方面,例如以降序的方式显示一个数据集,我们可以通过先逐行读取数据,然后压如一个栈中,在按照从栈中弹出的顺序来写入。这个方法的实现过程如下:

# S为ArrayStack的实例对象
def reverse_file(filename):
    S = ArrayStack()
    with open(filename) as orig:
        for line in orig:
            S.push(line.rstrip('\n'))
    with open(filename,'w') as fd:
        while not S.is_empty():
            fd.write(S.pop()+'\n')

简单的小例子就到这里,想要了解更多有趣内容,请关注‘小白piao学python’(会有不定期的公开课哦),如果想要咨询学习python的小技巧,可以联系小白piao的个人微信:wxi_xbp_python3:
python进阶之数据结构与算法--入门-利用列表实现栈(小白piao分享)