栈和队列—栈的应用

冰冻非一日之寒

这里介绍栈的三种应用~

编辑器—Ctrl+Z(撤销)

当我们在文档中打这样一句话“我爱数据结构”

假如,每次打两个字

我爱 数据 机构

把“结构”误打成“机构”,我们只需要 Ctrl+Z 一下

我爱 数据

随后,再打上“结构”二字就好了

我爱 数据 结构

这背后的原理就是栈的应用

栈和队列—栈的应用_第1张图片
图片发自App

假如,想撤销到这“我爱”,只需要再 Ctrl+Z 就好了

栈和队列—栈的应用_第2张图片
图片发自App


不仅仅是word文档软件,任何编辑器的撤销原理都是栈的应用

操作系统—系统调用栈

举例,这里有三个函数,A(),B(),C()

执行顺序如下图

栈和队列—栈的应用_第3张图片
图片发自App


首先,调用函数A()。当函数A执行到一半时,调用函数B(),这时会暂时中断函数A,去执行函数B。而此时系统栈会记录一个信息,我们给这个信息取名为A2,即函数A执行到第二行了,暂时中断,开始执行函数B(箭头表示执行到哪一步了)

栈和队列—栈的应用_第4张图片
图片发自App

同理,当函数B执行到第二行时,系统栈会记录一个信息B2

栈和队列—栈的应用_第5张图片
图片发自App

然后,执行函数C。当函数C执行完时,该怎么办呢?

栈和队列—栈的应用_第6张图片
图片发自App

此时,系统栈就起作用了。显然,系统栈的栈顶是B2,计算机便知道了,上一步操作是执行到函数B的第二行中断的,这时就可以跳到函数B的第二行继续向下执行了,同时B2也会出栈

栈和队列—栈的应用_第7张图片
图片发自App

当函数B执行完时,计算机会再去看系统栈,便知道上一次的中断位置为A2,这时计算机自动退回到A2位置并且继续向下执行程序(执行函数A的第三行),同时A2出栈

栈和队列—栈的应用_第8张图片
图片发自App

当函数A执行完时,计算机会继续看系统栈,而此时系统栈已经空了,计算机便知道此时程序已经全部结束了。

这就是子过程执行结束时计算机会自动退回到上一次中断位置的背后原理,即系统栈会记录程序执行时的中断点。

这和我们经常使用到的递归是类似的。

编辑器—括号匹配

当我们使用文档编辑器、代码编辑器工作时,都经常会用到括号,而我们使用的括号匹配不成功时,编辑器就会报错,那么,编辑器是如何知道的呢?其实,就是利用了栈这种数据结构。

首先,看一道Leetcode上的算法题

栈和队列—栈的应用_第9张图片
leetcode 中文版

题中的“关闭”,意思是“匹配”。

解题思想:对于给出的 括号字符串 ,对这个字符串从左到右依次判断,如果是左括号(、[、{ 其中的一个,就让其入栈;如果是右括号 }、[、( 其中的一个,便让其与栈顶元素相比较,二者相同就继续向下执行判断,直到找到一个不同的,返回false,即匹配不成功;如果遍历完所有字符串,没有发现不同的,就返回true,即匹配成功。

下面是java代码

你可能感兴趣的:(栈和队列—栈的应用)