栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

栈与堆(栈与一般线性表的区别主要在)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

栈与堆(栈与一般线性表的区别主要在)

        栈stack和队列queue都是线性操作的子集。

        stack只在表尾进行插入或者删除操作,是线性表。stack的尾端是栈顶(top),表头是栈底(bottom)。

        S = (,,…,),是表里第一个元素,称其为栈底bottom元素,是栈顶top元素,按顺序入栈,退栈的第一个元素是栈顶元素。(怎么感觉栈是沸腾片那种,最先装进去的bottom要最后才能吃到,封装前放进去的那一片top,顾客是最先吃到的呢嘻嘻)

        栈是LIFO(last in first out)。

        在看大三学《数据结构》用的书,当时用C语言上机,现在只看懂大概,不会写了,泪目。

一、顺序栈与链栈

        栈有两种存储结构:顺序栈、链栈。

1.1  顺序栈

        栈的顺序结构是利用一组地址连续的存储单元一次存放栈底到栈顶的数据元素。C语言上是在此同时放一个指针(记作top)指示栈顶元素,base一直指着栈底,top = base是空栈。

        python使用栈有三种操作:①stack=[];②collections.deque;③queue.LifoQueue. 目的都是实现栈的操作,常用的操作有:empty()、push(a)、pop()、top()、size(),因为是栈,查找中间的栈得不断拿出来栈顶的。

python中栈的实现 - 老张哈哈哈 - 博客园栈是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,栈中数据的插入删除操作都是在栈顶端进行,常见栈的函数操作包括 empty() – 返回栈是否为空 – Time Complexihttps://www.cnblogs.com/laozhanghahaha/p/12302836.html        老张哈哈哈的blog写得挺清楚的,我还是消化了一下。

1.1.1   stack=[]
stack = []      #stack = list()
# append(a) instand push(a)
stack.append('I')
stack.append(2)
stack.append(['my', 'hometown'])

stack
Out[1]: ['I', 2, ['my', 'hometown']]
#At that time, top is ['my', 'hometown'] and bottom is 'I'

#If we pop elements, the rule is:
print(stack.pop())
['my', 'hometown']

print(stack.pop())
2

print(stack.pop())
I

not stack   #empty?
Out[15]: True
1.1.2  collections.deque

        collections我只用过计数器Counter,使用方式也放下面了。

Python collections.Counter()函数_沃特么.拆基.达柴机的博客-CSDN博客_counter()函数原文链接:https://blog.csdn.net/qwe1257/article/details/83272340Python collections.Counter用法什么是collectionsCounterCounter操作例子什么是collectionscollections在python官方文档中的解释是High-performance container datatypes,...https://blog.csdn.net/rocking_struggling/article/details/104851741        collections.deque能提供时间复杂度O(1)的append(a)和pop(),比用列表的时间复杂度O(n)优秀。

import collections            #from collections import deque
stack = collections.deque()   #stack = deque()

stack.append('hi')

stack.append('friend!')

type(stack[0])
Out[2]: str

type(stack)
Out[3]: collections.deque

print(stack.pop())
friend!

print(stack.pop())
hi
1.1.3  queue.LifoQueue

        栈是LIFO的线性表,队列queue也是线性表,这样记忆挺好的。用queue.LifoQueue可以设置栈的大小(老张的例子设置了),可以不设。用put()放入元素,get()输出栈顶元素。

from queue import LifoQueue

stack = LifoQueue()

stack.put('good')

stack.put('boy')

type(stack[0])
#we will get → TypeError: 'LifoQueue' object is not subscriptable

type(stack)
Out[4]: queue.LifoQueue

print(stack.get())
boy

print(stack.get())
good

stack
Out[5]: 
1.2  链栈

        还没遇到相关的题目,留个白

二、栈的应用与对应的leetcode题目

        栈的应用挺多的,这几天在leetcode刷简单题经常遇到,从3月21日开始总结一下,没写的是暂时没有遇到,不代表不能用。

2.1  括号匹配检验(20、有效的括号)

        题目涉及到顺序和急迫匹配的问题。先搞懂什么算是有效,什么是无效。看题目给的输入和输出:

输入 s = "()";s = "()[]{}";s = "{[]}"。输出 都是true
输入 s = "(]";s = "([)]"。输出 都是false

        观察可知首先要有对应的括号匹配,其次后来者得匹配完了pop了,先来者才能匹配,有LIFO那味道了。例如s = "([)]",(是第一个输入的,急切想与)匹配,但第二个输入的是[,现在最急切的变成 [ 匹配一个 ] ,此时)输入,与 [ 的需求不匹配,直接就false了。

        按照这个思路,使用顺序栈是再好不过了。

        但是怎么安排括号配对,需要用字典。字典我再看看,还不太会。哈希表和字典啥关系啊晕。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/772519.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号