4.数据结构1——列表、栈与队列

数据结构1——列表

需要研究列表的以下几个问题: 

 python列表和c++数组对比:

1.数组元素类型必须相同,列表可以不同

2.数组长度固定,列表长度超过时系统帮你添加

在32位机上一个整数占32位,即4字节(64位机上就是8字节,同理)

如下图(不知道看得到否),假设c++数组中a[0]位置的元素是100,那么a[2]位置的元素为100+4*1=104,但是python列表是跳跃的比如列表中第一个元素对应计算机中100,第二个对应305,第三个对应12,这里的100,305,12叫地址,根据地址存储相当于把不同类型的数据转为地址,查找时先找到100+2*4=108,在找到108对应的地址12,找到地址对应元素3.1,就是多了地址查找这一步,但解决不同类型数据问题。

解决数组长度添加问题,是系统发现没有位置后,新建一个列表(比原来长度大一倍或大一些(有套自己的算法)),然后把原来的给copy过来,再在新列表中添加。

 储存问题:列表又叫顺序表,通过连续的内存储存

各操作时间复杂度:

查找:O(1)

添加append:O(1)

插入insert、删除pop/remove:O(n)(后面元素都要移动)

数据结构2——栈

 栈特点:先进后出,后进先出

 类的学习

初始化看这里

(19条消息) Python中__init__和self的意义和作用_刘明的博客-CSDN博客_python中__init__的意义以及作用https://blog.csdn.net/fisherming/article/details/93468969整体学习看这里

Python入门 类class 基础篇 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/30024792

class Stack:
    def __init__(self):
        self.stack=[]

    def push (self,element):
        self.stack.append(element)

    def pop(self):
        return self.stack.pop()

    def get_top(self):
        if len(self.stack)>0:
            return self.stack[-1]
        else:
            return None

stack=Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.get_top())
    

栈的应用——括号匹配问题

 假设这种(){[()[{}]]}

1.(进栈,)和栈顶比较,匹配,(出栈

2.{进栈,[进栈,(进栈,)与栈顶比较匹配出栈,[进栈,{进栈,}与栈顶元素匹配,{出栈,后同

结果能完全匹配的条件:

1.读完了且都能匹配

2.读完时栈是空的

算法实现

class Stack:
    def __init__(self):
        self.stack=[]

    def push (self,element):
        self.stack.append(element)

    def pop(self):
        return self.stack.pop()

    def get_top(self):
        if len(self.stack)>0:
            return self.stack[-1]
        else:
            return None
    def is_empty(self):
        return len(self.stack)==0

def match(s):
    match={"]":"[","}":"{",")":"("}
    stack=Stack()
    for ch in s:
        if ch in {"(","[","{"}:#集合
            stack.push(ch)
        else:
            if stack.is_empty():
                return False
            elif stack.get_top()==match[ch]:
                stack.pop()
            else:#不等于
                return False
    if stack.is_empty():
          return True
    else:
          return False

print(match('[]{()[()[]]}'))
print(match('[(]])'))

结果展示

数据结构3—— 队列

队列特点:先进先出FIFO

 队列运用简单列表会出现内存冗余或pop时间复杂度太高的问题

 引入环形队列

 空队列判定:rear==front

队满为了和空队列区分规定为(rear+1)%12(队列大小)==front

任何时刻rear指向最后一个数(空队列除外)而front不指向任何数

 双向队列与python自带的队列内置模块

 

deque([1,2,3],5)用于创建空队列 【1,2,3】是既有的元素,5用于设置最大长度,超出即leftpop,可以用于读取文件最后几行的功能

部分图片参考自b站IT编程界的扛把子的python算法学习视频,本文仅供个人学习使用,特此声明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值