栈的特点是先进先出,只允许在一端插入和删除数据。
栈顶:栈的最后一个元素
栈底:栈的第一个元素
出栈:从栈顶删除最后一个元素
入栈:向栈顶压入新的元素
如何实现一个栈?
栈可以用数组实现,也可以用链表来实现。
function Stack(){var items = [];//入栈this.push = function(elem){items.push(elem);}//出栈this.pop = function(){return items.pop();}//返回栈顶元素this.peek = function(){return items[items.length -1];}//是否是空栈this.isEmpty = function(){return items.length;}//栈的长度this.size = function(){return items.length;}//清空栈this.clear = function(){items = [];}//打印栈this.print = function(){console.log(items.toString());}}
栈的应用
栈在函数调用中的应用
函数被调用时,会被加入到调用栈顶部,执行结束后,就会从调用栈顶移除该函数。
function a (){b();}function b(){c();};a();

上图表示函数调用执行过程栈的变化。
栈在表达式求值中的应用
表达式求值是通过两个栈来实现,一个栈保存操作数,另一个栈保存运算符。
从左向右遍历表达式,当遇到数字时,将数字压入操作数栈;当遇到操作符时,与运算符栈的栈顶元素比较。
如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;
如果比运算符栈顶元素的优先级低或者相同,从运算符中取栈顶运算符,从操作数栈的栈顶取2个操作数,然后进行计算,再把计算结果压入操作数栈,继续比较。
课程例子:
栈在括号匹配中的应用
用来检测括号的嵌套是否合法
解答开篇
实现浏览器的前进和后退功能,使用两个栈(X和Y)实现。
首次浏览的页面依次压入栈X
当点击后退时,再依次从栈X中出栈,并将出栈的数据依次压入栈Y
当点击前进时,依次从栈Y中出栈,并将出栈的数据依次压入X
当栈X中没有数据时,说明没有页面可以继续后退浏览
当栈Y中没有数据时,说明没有页面可以继续前进浏览
课后思考
1.为什么函数调用要用“栈”来保存临时变量?用其他数据结构不行吗?
参考答案:
