1- 栈和队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

栈如同叠猫猫,而队列就像猫猫排队。
两者分别代表先入后出和先入先出的逻辑关系。

另外,栈和队列我们不应只将其作为两种数据结构,还应将其当成两种编程思想来学习。很多具有先入后出、先入先出关系的问题都可以利用栈和队列的思想来解决。

一、栈

1 栈的定义

栈(stack)是一种遵循先入后出逻辑的线性数据结构。

我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等),就得到了栈这种数据结构。

如图 5-1 所示,我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫作“入栈”,删除栈顶元素的操作叫作“出栈”。
在这里插入图片描述

2 栈的常用操作(Python中入栈与出栈操作)

栈的常用操作如下所示,具体的方法名需要根据所使用的编程语言来确定。在此,我们以常见的 push()、pop()、peek() 命名为例(Python里面就是append哪些)。

  • 元素入栈(添加至栈顶):push() , 时间复杂度 O ( 1 ) O(1) O(1)
  • 栈顶元素出栈 : pop() , 时间复杂度 O ( 1 ) O(1) O(1)
  • 访问栈顶元素 : peek(), 时间复杂度 O ( 1 ) O(1) O(1)

下面给出Python语言的栈是怎么用,Python中栈直接用列表就可以了,append()和pop()的效率足够快。

----- 使用列表当栈使用

【注】:列表尾是栈顶,列表头栈底,进出都只能通过栈顶。

  • stack.append(a) : 压栈,元素a入栈。
  • stack.pop() : 出栈,列表最后一个元素出栈(这也符合先入后出)
  • 栈元素访问:列表的访问就是了。

下面是演示:

# 初始化栈
# Python 没有内置的栈类,可以把 list 当作栈来使用
stack = []

# 元素入栈
stack.append(1)
stack.append(3)
stack.append(2)
stack.append(5)
stack.append(4)

# 元素出栈
cur = stack.pop()

# 访问栈顶元素
peek = stack[-1]

# 获取栈的长度
size = len(stack)

3 栈的实现*

规定:
规定链表头部是栈顶,链表尾部是栈底
规定列表尾部是栈顶,列表头部是栈底

(1)基于链表实现

from typing import Union
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
        
        
# 规定链表头部是栈顶,链表尾部是栈底
# 规定列表尾部是栈顶,列表头部是栈底 
class Stack:
    def __init__(self):
        self.stack : Union[ListNode, None] = None
        self.size: int = 0
        
    def get_size(self):
        '''返回栈的大小'''
        return self.size
    
    def is_empty(self):
        '''判断栈是否为空'''
        return self.size == 0
    
    def peek(self):
        '''返回栈顶元素'''
        if self.is_empty():
            return None
        return self.stack.val
    
    
    def push(self, x: int):
        '''入栈'''
        node = ListNode(x)
        node.next = self.stack
        self.stack = node
        self.size += 1
        
    def pop(self):
        '''出栈'''
        # 链表头是栈顶
        num = self.peek()
        if num is not None:
            self.stack = self.stack.next
            self.size -= 1
        return num
    
    def to_list(self):
        '''将栈转换为列表用于打印'''
        
        res = []
        node = self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值