数据结构之栈和队列(Python实现)

前言

        突发奇想,写一写python如何去实现C语言中经典的数据结构。视频推荐中国MOOC陈斌老师的python数据结构课,讲的详细周到,例题丰富。数据结构与算法Python版_北京大学_中国大学MOOC(慕课) (icourse163.org)

笔者能力,水平有限,文章中如有错误和不周到的地方,还请大家指正。

定义

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

数据结构之栈和队列(Python实现)_第1张图片

实现

        在python中,并没有结构体,那么如何去实现栈?python是面向对象的语言,我们自己定义一个类即可实现。首先要了解列表这个python内置的数据类型,不知道的朋友可以,看看其他博主写的详细博客。

       1.定义一个类,其中的 __init__方法相当于java中的构造函数。简而言之,在创建一个类对象之后一定会调用的方法。命名一个变量,例如items用列表赋值,以便后序的操作。

class Stack:
    def __init__(self):
        self.items = []

        2. 编写入栈,出栈等方法。下述方法基本满足栈的使用。

# 判断栈是否为空,如空返回True,否则False
    def isempty(self):
        return self.items == []
    # 入栈,使用列表的append方法,在列表末尾(栈顶)添加元素
    def push(self, item):
        self.items.append(item)
    # 出栈,调用列表方法,在列表末尾(栈顶)弹出元素
    def pop(self):
        return self.items.pop()
    # 返回栈顶元素
    def peek(self):
        return self.items[-1]
    # 返回当前栈长
    def size(self):
        return len(self.items)

        3.如此,在其他的py文件中便可导入我们自定义的Stack数据类型了。

# 导入栈
from Stack import Stack

# 将栈数据类型赋值给变量
s = Stack()
# 进栈
s.push(1)
s.push('a')
s.push('*')
s.push(123)
# 出栈
s.pop()
print(s.pop())
# 栈长
print(s.size())

队列

定义

        队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

        队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。 

数据结构之栈和队列(Python实现)_第2张图片

 

实现

class Queue:
    # 初始函数
    def __init__(self):
        self.items = []
    # 入队,在列表末尾(队尾)添加元素
    def enqueue(self,item):
        self.items.append(item)
    # 出队,在列表开头(队头)删除元素
    def dequeue(self):
        self.items.pop(0)
    # 返回队长
    def size(self):
        return len(self.items)
    # 判断是否队空
    def isempty(self):
        return self.items == []

就像上面栈一样使用即可,就不打代码实现了。(手动擦汗) 

双端队列

        此处做一下小扩展,双端队列 (deque)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。尽管双端队列看起来似乎比栈和队列更灵活,但实际上在应用程序中远不及栈和队列有用。

实现

class Deque:
    def __init__(self):
        self.items = []

    def addfront(self, item):
        self.items.insert(0, item)

    def addrear(self, item):
        self.items.append(item)

    def removefront(self):
        self.items.pop(0)

    def removerear(self):
        self.items.pop()

    def isempty(self):
        return self.items == []

    def size(self):
        return len(self.items)

 文章到此结束,感谢各位观看查阅。祝诸君代码越打越溜!!!

你可能感兴趣的:(数据结构,python)