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

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

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

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

栈的应用:

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

表达式求值

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

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

c5c4d42b4389

image.jpeg

在括号匹配中的应用

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

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

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

浏览器的前进和后退功能

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

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

c5c4d42b4389

image.jpeg

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

c5c4d42b4389

image.jpeg

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

c5c4d42b4389

image.jpeg

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

c5c4d42b4389

image.jpeg

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-springmvc code-based

idea设置maven在下载依赖的同时把对应的源码下载过来。图0:1主要实现零配置来完成springMVC环境搭建,当然现在有了springBoot也是零配置,但是很多同仁都是从spring3.x中的springMVC直接过渡到springBoot的,spring3.x的MVC大部分都…

powershell 入门_使用PowerShell入门的5个Cmdlet

powershell 入门PowerShell is quickly becoming the preferred scripting language and CLI of Power Users as well as IT Pros. It’s well worth learning a few commands to get you started, so we’ve got 5 useful cmdlets for you to learn today. PowerShellSwift成为…

Part 3: Services

介绍 在第3部分中,我们将扩展应用程序并启用负载平衡。为此,我们必须在分布式应用程序的层次结构中提升一个级别:服务。 StackServices (你在这里)Container (涵盖在第2部分中)关于服务 在分布式应用程序中,应用程序的不同部分被称为“服务”…

diy感应usb摄像头拍照_DIY无线感应充电器

diy感应usb摄像头拍照Courtesy of Instructables user Inducktion shares a very detailed tutorial on how to build a wireless power charger. He explains the impetus behind the project: 由Instructables用户提供Inducktion分享了有关如何构建无线电源充电器的非常详细…

常用模块之 time,datetime,random,os,sys

time与datetime模块 先认识几个python中关于时间的名词: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。1970年之前的日期无法以此表…

使用aSpotCat控制您的Android应用权限

Viewing the permissions of each installed Android app requires digging through the Manage Applications screen and examining each app one by one — or does it? aSpotCat takes an inventory of the apps on your system and the permissions they require. 要查看每…

xtrabackup备份mysql“ib_logfile0 is of different”错误分析

今天用xtrabackup工具完整备份mysql数据库的时候出现“./ib_logfile0 is of different”错误,具体的日志信息如下: 我第一时间查询了百度和谷歌都没有找见相对应的答案。决定从错误日志入手,上面的日志提示说:mysql数据库inondb的日志文件的大…

如何使自己的不和谐机器人

Discord has an excellent API for writing custom bots, and a very active bot community. Today we’ll take a look at how to get started making your own. Discord具有出色的用于编写自定义机器人的API,以及非常活跃的机器人社区。 今天,我们将探…

​css3属性选择器总结

css3属性选择器总结 &#xff08;1&#xff09;E[attr]只使用属性名&#xff0c;但没有确定任何属性值 <p miaov"a1">111111</p> <p miaov"a2">111111</p> p[miaov]{background: red;} /*所有属性为miaov的元素都会被背景变红&a…

程序代码初学者_初学者:如何使用热键在Windows中启动任何程序

程序代码初学者Assigning shortcut keys to launch programs in Windows is probably one of the oldest geek tricks in the book, but in true geek fashion we are going to show you how to do it in Windows 8. 分配快捷键以在Windows中启动程序可能是本书中最古老的怪胎技…

stevedore——启用方式

2019独角兽企业重金招聘Python工程师标准>>> setuptools维护的入口点注册表列出了可用的插件&#xff0c;但是并没有为最终用户提供使用或启用的方法。 下面将描述用于管理要使用的扩展集的公共模式。 通过安装方式启用 对于许多应用程序&#xff0c;仅仅安装一个扩…

C# -- 文件的压缩与解压(GZipStream)

文件的压缩与解压 需引入 System.IO.Compression; 1.C#代码&#xff08;入门案例&#xff09; 1 Console.WriteLine("压缩文件...............");2 using (FileStream fr File.OpenRead("d:\\test.txt"))3 {4 …

win7屏保文件.scr_如何将屏保添加到Ubuntu 12.04

win7屏保文件.scrUbuntu 12.04 doesn’t ship with any screen savers, just a black screen that appears when your system is idle. If you’d rather have screensavers, you can swap gnome-screensaver for XScreenSaver. Ubuntu 12.04没有附带任何屏幕保护程序&#xff…

简单读写XML文件

IPAddress.xml 文件如下&#xff1a; <?xml version"1.0" encoding"utf-8"?><IP><IPAddress>192.168.0.120</IPAddress></IP> 在 Form 窗体(读取XML配置.Designer.cs)中有如下控件&#xff1a; 代码 privateSystem.Wind…

如何与Ubuntu One同步配置文件

Ubuntu One lets you easily synchronize files and folders, but it isn’t clear how to sync configuration files. Using Ubuntu One’s folder synchronization options or some symbolic links, you can synchronize configuration files across all your computers. Ubu…

智能家居设备_您的智能家居设备正在监视您吗?

智能家居设备In a world where we’re all paranoid about devices spying on us (and rightfully so), perhaps no other devices receive more scrutiny than smarthome products. But is that scrutiny warranted? 在一个我们都对监视设备的人都抱有偏执的世界(理应如此)&a…

Jenkins忘记admin密码处理方法

1、先找到enkins/config.xml文件&#xff0c;并备份。 此文件位于Jenkins系统设置的主目录&#xff0c;根据自己的配置情况而定。我的位置如下 /data/temp/jenkins/config.xml2、然后编辑config.xml删除<useSecurity>true</useSecurity>至</securityRealm>&a…

科研绘图工具软件_如何在Windows 10 Mail中使用绘图工具

科研绘图工具软件Microsoft recently released a new feature for the Windows 10 Mail app that lets you convey messages with drawings right inside the body of an email. This is a great way to quickly sketch things like graphs or tables to get your point across…

子元素相对于父元素垂直居中对齐

记个笔记 1. 元素相对于浏览器居中 <style>.window-center {/* 将position设置为fixed&#xff0c;使元素相对于浏览器窗口定位 */position: fixed;/* 将margin设置为auto&#xff0c;使浏览器自动推算元素外边距 */margin: auto;/* 将上下左右边距&#xff08;相对于浏览…

网站运行java_定制化Azure站点Java运行环境(5)

Java 8下PermGen及参数设置在上一章节中&#xff0c;我们定制化使用了Java 8环境&#xff0c;使用我们的测试页面打印出了JVM基本参数&#xff0c;但如果我们自己观察&#xff0c;会发现在MXBeans中&#xff0c;没有出现PermGen的使用数据&#xff0c;初始大小等信息&#xff0…