数据结构与算法——栈

本文主要介绍一种重要的数据结构——栈,及其Python语言下的实现方式。

在了解了线性表这种数据结构之后,我们会思考线性表的具体应用,栈就是其中一种重要的形式。

栈的基本介绍

栈和队列都是保存数据元素的容器,都是简单的缓存结构,都只支持数据项的存储和访问操作,不支持数据项之间的任何关系。因此,两种数据结构的操作集合都很小,很简单,其中最重要的就是存入元素和取出元素。当然,作为数据结构还应包含几个任何数据结构都应包含的操作,如结构的构建,查空状态等。当然,栈和队列的最大区别在于存取时间顺序关系更方面的特点:

  • 栈是保证元素后进先出(后存入者先使用,Last In First Out)关系的结构,简称为LIFO结构。
  • 队列是保证元素先进先出(先存入者先使用,First In First Out)关系的结构,简称为FIFO结构。

对于一个栈或者队列,在任何时候,下一次访问或者删除的元素都默认地唯一确定了,只有新存入或者删除(弹出)操作才会改变下一次默认访问的元素。
生活中有很多栈的应用实例,比如我们使用浏览器有一个后退功能,即回到上一个网页,这就是应用的栈的原理;再如我们操作word有撤销功能,这也是一种栈的应用。栈的应用是非常广泛的,这里不重点介绍。

栈的Python语言实现。

前面我们有说过栈是线性表的一种具体应用,对于线性表来说又有两种实现模型:顺序表和链表。下面将基于这两种结构讨论栈的实现。

栈的顺序表实现

# 栈的顺序表实现
class SStack():
    #初始化并创建空栈
    def __init__(self):
        self._elems = []

    #检测是否为空
    def is_empty(self):
        return self._elems == []

    #输出栈顶数据
    def top(self):
        if self._elems == []:
            raise StackUnderflow('in stack.top()')
        return  self._elems[-1]

    #压入元素
    def push(self, elem):
        self._elems.append(elem)

    #弹出元素
    def pop(self):
        if self._elems == []:
            raise StackUnderflow('in stack.pop()')
        self._elems.pop()

栈的链表实现

# 栈的链表实现
class LStack():
    def __init__(self):
        self._top = None

    def is_empty(self):
        return self._top == None

    def top(self):
        if self._elems == []:
            raise StackUnderflow('in stack.top()')
        return self._top.elem

    def push(self, elem):
        self._top.next = LNode(elem, self._top)

    def pop(self):
        if self._elems == []:
            raise StackUnderflow('in stack.pop()')
        p = self._top
        self.top = p.next
        return p.elem
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值