1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python数据结构与算法第六讲_Python 学习 -- 数据结构与算法 (六)

python数据结构与算法第六讲_Python 学习 -- 数据结构与算法 (六)

时间:2023-05-30 22:32:15

相关推荐

python数据结构与算法第六讲_Python 学习 -- 数据结构与算法 (六)

栈 是一种 “操作受限”的线性表,只允许在一端插入和删除数据。

从功能是上来说,数组和链表确实可以替代栈,但是特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。

当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。

栈的应用:

函数调用,操作系统给每个线程分配了一块独立的内存空间,这个内存被组织成“栈”这种结构,用来存储函数调用时的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈。

表达式求值

比如 3 + 5 * 8 - 6,编译器通过两个栈来实现,其中一个保存操作数的栈,另一个是保存运算符的栈,从左向右遍历表达式,当遇到数字,我们就直接压入操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较。

如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取2个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较。

image.jpeg

在括号匹配中的应用

假设表达式中只包含三种括号,圆括号()、方括号[]和花括号{},并且他们可以任意套装。比如,{[{}]}为合法格式,而 {[}()] 或 [({)]}为不合法格式,现在检查其合法性。

用栈来保存未匹配的左括号,从左到右依次扫描字符串。当扫描到左括号时,则将其压入栈中;当扫描到右括号时,从栈顶取出一个左括号,如果能够匹配,比如 ) 跟 ( 匹配, [ 跟 ] 匹配,则继续扫描剩下的字符串,如果在扫描的过程中,遇到不能配对的右括号,或者栈中没有数据,则说明为非法格式。

当所有的括号都扫描完成之后,如果栈为空,则说明字符串为合法格式;否则,说明有未匹配的左括号,为非法格式。

浏览器的前进和后退功能

使用两个栈,X 和 Y, 把首次浏览的页面一次压入栈 X, 当点击后退按钮时,再一次从栈 X 中出栈,并将出栈的数据一次放入栈 Y。 当我们点击前进按钮时,依次从栈 Y 中取出数据,放入栈 X 中。当栈 X 中没有数据时,那就说明没有页面可以继续后退浏览了,当栈 Y 中没有数据时,说明没有页面可以点击前进按钮浏览了。

比如,顺序查看了 a, b, c 三个页面,依次把 a, b, c 压入栈,这个时候,两个栈的数据就是这个样子:

image.jpeg

当通过浏览器的后退按钮,从页面 c 后退到页面 a 之后,就依次把 c 和 b 从栈 X 中弹出,并且依次放入到栈 Y。 这个时候,两个栈的数据就是这个样子:

image.jpeg

这个时候,如果又想看页面b,于是又点击前进按钮回到b页面,就把b从栈Y中出栈,放入栈X中,此时,两个栈的数据就是这个样子:

image.jpeg

这个时候,通过页面b又跳转到新的页面d了,页面 c 就无法再通过 前进、后退按钮重复查看了,所以需要清空栈 Y。此时两个栈的数据是这个样子:

image.jpeg

总的来说,栈是一种操作受限的数据结构,只支持入栈和出栈操作,后进先出是它最大的特点。栈既可以通过数组实现,也可以通过链表来实现。不管是基于数组还是链表,入栈、出栈的时间复杂度都为 O(1)。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。