Leetcode练习之栈

本文详细介绍了栈这一数据结构,包括其后进先出的特性、顺序栈和链式栈的存储方法。顺序栈通过数组实现,链式栈借助单链表。栈的基本操作如初始化、入栈、出栈、获取栈顶元素等在代码中得以体现。此外,还展示了链式栈的节点结构和操作方法。
摘要由CSDN通过智能技术生成

简介

简单来说,栈是一种后进先出的线性表

  • 线性表:具有前驱后续的线性关系,栈中元素按照a_{1},a_{2},…,a_{n}

    栈顶的元素叫做an

  • 后续先进原则

    每次删除优先删除堆栈中当前的栈顶元素,即最后进入堆栈的元素。

堆栈的存储方法

  • 顺序栈:堆栈的顺序存储结构,利用一组地址连续的存储单元依次存放自栈底到栈顶的元素,同时使用指针top指示栈顶元素在顺序栈的位置
  • 链式栈:利用单链表的方式来实现栈,栈中的元素按照插入顺序依次插入到链表的第一个节点之前,并使用栈顶指针top指示栈顶元素,top永远指向链表的头结点位置

栈的基本操作

  • 初始化空栈:创建一个空栈,定义栈的大小size,以及栈顶元素指针top
  • 判断栈是否为空:当堆栈为空时,返回True。当
栈的顺序存储基本描述

约定self.top指向栈顶元素所在位置

栈的代码实现

class Stack:
    def __init__(self,size = 100):
        self.stack = []
        self.size = size
        self.top = -1
    # 入栈
    def push(self, element):
        if self.is_full():
            raise Exception("Stack is full")
        else:
            self.stack.append(element)
            self.top +=1
        
        self.stack.append(element)
    # 出栈
    def pop(self):
        if self.is_empty():
            raise Exception("Stack is empty")
        else:
            self.top -=1
            self.stack.pop()
    # 得到栈顶元素
    def get_top(self):
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None
    # 判断是否为空
    def is_empty(self):
        return self.top == -1
    # 判断是否是满的
    def is_full(self):
        return self.top + 1 == self.size
    # 
    def peek(self):
        if self.is_empty():
            raise Exception("Stack is empty")
        else:
            return self.stack[self.top]

栈的链式存储

初始化空栈:使用链表创建一个空栈,并令栈顶元素指针self.top指向None,即self.top=None。
判断栈是否为空:当self.top==None时,说明堆栈为空,返回True,否则返回False。
获取栈顶元素:先判断堆栈是否为空,为空直接抛出异常。不为空则返回sef.top指向的栈顶节点值,即self.top.value.
插入元素(进栈、入栈):创建值为value的链表节点,插入到链表头节点之前,并令栈顶指针self.top指向新的头节点。
删除元素(出栈、退栈):先判断队列是否为空,为空直接抛出异常。如果堆栈不为空,则令self.top链表移动1位,并返回self.top.value。

栈的链式j结构代码

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值