栈是一种操作受限的线性表,后进先出。用数组实现的叫顺序栈,用链表实现的叫链式栈。入栈、出栈的时间复杂度都为O(1)。
1.栈在函数调用中的应用
对每个线程会单独创建一个运行时栈。对每个函数呼叫会在栈内存生成一个栈帧(Stack Frame)。所有的局部变量将在栈内存中创建。栈区是线程安全的,因为它不是一个共享资源。栈帧被分为三个子实体:
a 局部变量数组 – 包含多少个与方法相关的局部变量并且相应的值将被存储在这里。
b 操作数栈 – 如果需要执行任何中间操作,操作数栈作为运行时工作区去执行指令。
c 帧数据 – 方法的所有符号都保存在这里。在任意异常的情况下,catch块的信息将会被保存在帧数据里面。
2.栈在表达式求值中的应用
比如计算表达式 34+13*9+44-12/3。编译器通过两个栈,一个保存操作数,一个保存运算符。从左到右遍历表达式,数字压入操作数栈,运算符压入运算符栈。如果运算符比栈顶元素优先级低或者相同,就从操作数栈中取两个操作数计算,把结果压入操作数,继续比较。
3.栈在检测括号是否匹配
用栈保存未匹配的左括号,从左到右遍历字符串,遇到左括号压入栈中,遇到右括号从栈顶取出一个左括号进行匹配,继续匹配。
4.栈如何实现浏览器的前进和后退功能
利用两个栈,把正常浏览的页面依次压入第一个栈,当后退时,从第一个栈顶取出一个页面压入第二个栈,前进时从第二个栈取出一个值压入第一个栈,正常浏览后清空第二个栈。