(五)栈的应用

栈是一种操作受限的线性表,后进先出。用数组实现的叫顺序栈,用链表实现的叫链式栈。入栈、出栈的时间复杂度都为O(1)。

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

对每个线程会单独创建一个运行时栈。对每个函数呼叫会在栈内存生成一个栈帧(Stack Frame)。所有的局部变量将在栈内存中创建。栈区是线程安全的,因为它不是一个共享资源。栈帧被分为三个子实体:

a 局部变量数组 – 包含多少个与方法相关的局部变量并且相应的值将被存储在这里。

b 操作数栈 – 如果需要执行任何中间操作,操作数栈作为运行时工作区去执行指令。

c 帧数据 – 方法的所有符号都保存在这里。在任意异常的情况下,catch块的信息将会被保存在帧数据里面。


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

比如计算表达式 34+13*9+44-12/3。编译器通过两个栈,一个保存操作数,一个保存运算符。从左到右遍历表达式,数字压入操作数栈,运算符压入运算符栈。如果运算符比栈顶元素优先级低或者相同,就从操作数栈中取两个操作数计算,把结果压入操作数,继续比较。

3.栈在检测括号是否匹配

用栈保存未匹配的左括号,从左到右遍历字符串,遇到左括号压入栈中,遇到右括号从栈顶取出一个左括号进行匹配,继续匹配。

4.栈如何实现浏览器的前进和后退功能

利用两个栈,把正常浏览的页面依次压入第一个栈,当后退时,从第一个栈顶取出一个页面压入第二个栈,前进时从第二个栈取出一个值压入第一个栈,正常浏览后清空第二个栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值