LeetCode算法笔记


前言

Datawhale十月组队学习,LeetCode算法学习堆栈


提示:以下是本篇文章正文内容,下面案例可供参考

一、堆栈是什么?

堆栈:一种线性表数据结构,是一种只允许在表的一端进行插入和删除操作的线性表。具有先进后出的特性。

我认为堆栈的本质还是线性表或链表,只是对线性表或链表加上一种限制。

二、堆栈的基本操作

1.堆栈的顺序存储

堆栈的顺序存储是在数组的基础上完成的。在 Python中我们可以借助列表来实现。这种采用顺序存储结构的堆栈也被称为「顺序栈」。

在初始化顺序栈的过程中,要设置栈底和栈顶,定义顺序栈的大小。

代码如下:

class Stack:
    # 初始化空栈
    def __init__(self, size=100):
        self.stack = []
        self.size = size
        self.top = -1    
        
    # 判断栈是否为空
    def is_empty(self):
        return self.top == -1
    
    # 判断栈是否已满
    def is_full(self):
        return self.top + 1 == self.size
    
    # 入栈操作
    def push(self, value):
        if self.is_full():
            raise Exception('Stack is full')
        else:
            self.stack.append(value)
            self.top += 1
    
    # 出栈操作
    def pop(self):
        if self.is_empty():
            raise Exception('Stack is empty')
        else:
            self.stack.pop()
            self.top -= 1
    
    # 获取栈顶元素
    def peek(self):
        if self.is_empty():
            raise Exception('Stack is empty')
        else:
            return self.stack[self.top]

2.堆栈的链式存储

堆栈的链式存储是在链表的基础上完成的,但堆栈的链式存储又与单链表所不同,单链表的链节点指针指向的是下一个链节点的地址,而堆栈的链式存储中的链节点指针指向的是上一个链节点的地址。

在堆栈的链式存储中不需要判断链栈是否已满,只需判断链栈是否为空。堆栈的链式存储与堆栈的顺序存储不同,不需要事先定义堆栈的大小。

代码如下:

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
        
class Stack:
    # 初始化空栈
    def __init__(self):
        self.top = None
    
    # 判断栈是否为空
    def is_empty(self):
        return self.top == None
    
    # 入栈操作
    def push(self, value):
        cur = Node(value)
        cur.next = self.top
        self.top = cur
    
    # 出栈操作
    def pop(self):
        if self.is_empty():
            raise Exception('Stack is empty')
        else:
            cur = self.top
            self.top = self.top.next
            del cur
    
    # 获取栈顶元素
    def peek(self):
        if self.is_empty():
            raise Exception('Stack is empty')
        else:
            return self.top.value


总结

通过对堆栈的学习,了解堆栈是一种线性表数据结构,具有先进后出的特性。可以根据这种特性,解决具有相同特性的问题,例如括号问题、逆波兰表示法求值等。堆栈的表示有两种方式,一堆栈的顺序存储,这是在数组的基础上完成的,在初始化顺序栈的过程中,要设置栈底和栈顶,定义顺序栈的大小;二堆栈的链式存储,这是在链表的基础上完成的,但堆栈的链式存储又与单链表所不同,单链表的链节点指针指向的是下一个链节点的地址,而堆栈的链式存储中的链节点指针指向的是上一个链节点的地址。在堆栈的链式存储中不需要判断链栈是否已满,只需判断链栈是否为空。堆栈的链式存储与堆栈的顺序存储不同,不需要事先定义堆栈的大小。
在有了数组,链表知识的基础上,再去学习堆栈,理解起来会非常容易。
我认为堆栈的本质还是线性表或链表,只是对线性表或链表加上一种限制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霜枫91

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值