栈和队列python实现

2023-07-30 11:07:40 浏览数 (1)

栈-LIFO数据结构

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

----来自百度百科 

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

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

栈代码

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

代码语言:javascript复制
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:

代码语言:javascript复制
    def __init__(self):
        self.length = 0
        self.volume = []
        self.toppointer = -1

push()

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

代码语言:javascript复制
    def push(self, temp):
        self.volume.append(temp)
        self.length, self.toppointer = self.length   1, self.toppointer   1

pop()

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

代码语言:javascript复制
    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的列表元素。

代码语言:javascript复制
    def top(self):
        if (self.empty()):
            print('Sorry,this is a empty stack!')
            return
        return self.volume[self.toppointer]

empty()

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

代码语言:javascript复制
    def empty(self):
        if (self.length == 0):
            return True
        return False

size()

额,返回length……

代码语言:javascript复制
    def size(self):
        return self.length

队列代码

代码语言:javascript复制
class queue:
    def __init__(self):
        self.length = 0
        self.volume = []

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

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

    def front(self):
        if (self.empty()):
            print('Sorry,this is a empty queue!')
            return
        return self.volume[0]

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

    def size(self):
        return self.length

0 人点赞