数据结构之——Python实现堆栈

本文介绍如何使用Python实现栈的顺序存储结构与链式存储结构。栈是一种先入后出的数据结构,广泛应用于多种场景。文章提供了完整的代码示例,演示了栈的基本操作,包括入栈、出栈及显示栈中元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈是典型的先入后出的数据结构,在很多场合都有重要的应用,本文主要介绍用python实现栈的顺序存储结构和链式存储结构。

一 栈的顺序存储结构

栈的顺序存储结构,其实是线性表顺序存储结构的简化,使用python列表的append()和pop()可以很轻松的实现出栈,入栈的操作,具体的代码如下。入栈和出栈操作均没有涉及到循环结构,因此时间复杂度均是O(1)。

class stack(object):
    def __init__(self,maxsize):
        self.size = maxsize
        self.stack = []
        self.top = -1

    # 入栈
    def push(self,data):
        # 栈满
        if (self.top + 1) == self.size:
            print("The stack is full!")
            return 0
        else:
            self.stack.append(data)
            self.top += 1

    # 出栈
    def pop(self):
        # 栈空
        if self.top == -1:
            print("The stack is empty!")
            return 0
        else:
            self.stack.pop()
            self.top -= 1

    # 显示栈中元素
    def show(self):
        print(self.stack)

if __name__ == '__main__':
    # 新建size为50的栈
    s = stack(50)
    # 栈中压入0~9
    for i in range(10):
        s.push(i)
    s.show()
    # 删除栈顶的元素9
    s.pop()
    s.show()

程序的输出结果如下:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8]

二 栈的链式储存结构

栈的顺序存储结构很方便,因为它只准栈顶进出元素,不存在线性表插入和删除需要移动元素的问题。但是也存在一个缺点,就是必须事先确定存储空间的大小,栈满时就要手动扩充容量,比较麻烦。而使用链表来存储栈,基本不存在栈满的情况,栈顶放在链表的头部,栈顶指针代替头结点。

# 定义节点
class Node(object):
    def __init__(self, val):
        self.val = val
        self.next = None

# 定义链栈
class LinkStack(object):
    def __init__(self):
        self.top = -1

    # 入栈
    def push(self, data):
        s = Node(data)
        s.next = self.top
        self.top = s

    # 出栈
    def pop(self):
        if self.top == None:
            print("The LinkStack is empty!")
            return 0
        else:
            value = self.top.val
            self.top = self.top.next
            return value

if __name__ == "__main__":
    s = LinkStack()
    # 0~9压入栈中
    for i in range(10):
        s.push(i)
    # 栈顶的3个元素出栈
    for i in range(3):
        print(s.pop())

程序输出的结果为:

9
8
7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值