栈的应用括号匹配python_数据结构与算法(5):栈

b6b151166e2900ed164d3b5dd49e0cdc.png

(文中图片出自王争老师的课程:数据结构与算法之美,侵删)

栈是一种后进者先出,先进者后出的线性表结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。

从功能上来说,数组或链表可以替代栈,但特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构

1.栈在函数调用中的应用

操作系统为每个县城分配一块独立的内存空间,这些内存被组织成栈的结构,用来存储函数调用时的临时变量,每次进入一个函数,就会将临时变量作为一个栈帧入栈。

public static void main(){
   int a =1;
   int ret = 0;
   int res = 0;
   ret = add(3,5);
   res = a + ret;
   sout(result);
}

public int add(int x,int y){
   int sum = 0;
   sum = x+y;
   return sum; 
}

上面代码中,main函数里面调用了add函数,下图先是了函数调用栈的情况。

c4ff3e20c62febe99c16e09ba0da1733.png
图片引自数据结构与算法之美,侵删

从数据进入被调用函数,对于数据的变化是作用域,只要保证每次进入一个函数,都是一个新的作用域。因此在进入被调用函数的时候,分配一段栈空间给这个珊瑚的变量,函数结束后,将栈顶复位,正好回到调用函数的作用域。

2.栈在表达式求值中的应用

      表达式:      3 + 5*8 -6

这个表达式,编译器通过两个栈来实现,一个是操作数的栈,另一个是运算符的栈。从左到右,遇到数字就压入操作数栈,遇到运算符就与运算符栈顶元素比较。

如果运算符比栈顶元素优先级高,则直接压入栈;反之,如果优先级比栈顶元素低或者相同,则从运算符栈中取出栈顶元素,从操作数栈的栈顶去2个元素进行操作服的运算,计算结果压入操作数栈。

44afbe19e913dbc9d95c7648a1a98aef.png
图片出自数据结构与算法之美,侵删

3.栈在括号匹配中的应用

假设表达式中只包含三种括号,圆括号 ()、方括号[]和花括号{},并且它们可以任意嵌套。比如, {[] ()[{}]} [{()}([])] 等都为合法格式,而{[}()]或[({)]为不合法的格式。那我现在给你一个包含三种括号的表达式字符串,如何检查它是否合法。

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

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


LeetCode对应编号:20, 155, 232, 844, 224, 682, 496

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值