栈-python实现

947 阅读2分钟

​持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

栈-LIFO数据结构

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

简单来说,栈作为一种数据结构,特点是先进去的后出来,后进去的先出来,属于后进先出(last in first out)的LIFO结构。

栈的基本操作有压栈push,弹栈pop,判空empty,取栈顶元素top,取栈当前容量size等等。

python代码

python没有指针,无法自己完完全全从零实现一个栈,但是我们可以用列表来模拟实现这个栈。以下是全代码,之后进行逐一分析讲解。

class stack:
    def __init__(self):
        self.length = 0
        self.volume = []
        self.toppointer = -1

    def push(self, temp):
        self.volume.append(temp)
        self.length, self.toppointer = self.length + 1, self.toppointer + 1

    def pop(self):
        if (self.empty()):
            print('Sorry,this is a empty stack!')
            return
        self.volume.pop()
        self.length, self.toppointer = self.length - 1, self.toppointer - 1

    def top(self):
        if (self.empty()):
            print('Sorry,this is a empty stack!')
            return
        return self.volume[self.toppointer]

    def empty(self):
        if (self.length == 0):
            return True
        return False

    def size(self):
        return self.length

首先是栈的初始化,具体操作是用一个空的列表作为栈空间,length代表栈的当前容量,初始化为0,toppointer用来指向栈顶元素,初始化为-1:

    def __init__(self):
        self.length = 0
        self.volume = []
        self.toppointer = -1

push()

压栈操作的话,直接用列表的尾插,然后让length和toppointer加1。

    def push(self, temp):
        self.volume.append(temp)
        self.length, self.toppointer = self.length + 1, self.toppointer + 1

pop()

弹栈的话,需要做好安全措施,先判断栈是不是空的,因为我们后面会实现这个判断空栈的函数,所以可以先直接调用,不是空栈我们就弹栈,调用列表的pop删掉尾元素,再让length和toppointer减1。

    def pop(self):
        if (self.empty()):
            print('Sorry,this is a empty stack!')
            return
        self.volume.pop()
        self.length, self.toppointer = self.length - 1, self.toppointer - 1

top()

取栈顶元素,同样我们先判断是不是空栈,不是空栈再返回下标为toppointer的列表元素。

    def top(self):
        if (self.empty()):
            print('Sorry,this is a empty stack!')
            return
        return self.volume[self.toppointer]

empty()

判断栈是不是空的,直接看length是不是0。

    def empty(self):
        if (self.length == 0):
            return True
        return False

size()

额,返回length……

    def size(self):
        return self.length