-
栈(stack),它是一种运算受限的线性表,后进先出(LIFO)
-
LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间. 类似于自动餐托盘, 最后放上的托盘, 往往先把拿出去使用.
-
其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
-
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;
-
从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
-
-
生活中类似于栈的
-
自助餐的托盘, 最新放上去的, 最先被客人拿走使用.
-
收到很多的邮件(实体的), 从上往下依次处理这些邮件. (最新到的邮件, 最先处理)
-
注意: 不允许改变邮件的次序, 比如从最小开始, 或者处于最紧急的邮件, 否则就不再是栈结构了. 而是队列或者优先级队列结构.
-
我们使用JavaScript语言来封装一个栈
function Stack(){
this.item=[]
Stack.prototype.push=function(element){
return this.item.push(element)
}
Stack.prototype.pop=function(){
return this.item.pop()
}
Stack.prototype.peek=function(){
return this.item[this.item.length-1]
}
Stack.prototype.isEmpty=function(){
return this.item.length==0
}
Stack.prototype.size=function(){
return this.item.length
}
Stack.prototype.toString=function(){
this.item.join(" ")
}
}
-
代码解析:
-
我们创建了一个Stack构造函数, 用户创建栈的类.
-
在构造函数中, 定义了一个变量, 这个变量可以用于保存当前栈对象中所有的元素.
-
这个变量是一个数组类型. 我们之后无论是压栈操作还是出栈操作, 都是从数组中添加和删除元素.
-
栈有一些相关的操作方法, 通常无论是什么语言, 操作都是比较类似的.
-
-
栈的操作:
-
push(element)
: 添加一个新元素到栈顶位置。我们的实现是将最新的元素放在了数组的末尾, 那么数组末尾的元素就是我们的栈顶元素 -
pop()
:移除栈顶的元素,同时返回被移除的元素。出栈操作应该是将栈顶的元素删除, 并且返回 -
peek()
:返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)。和pop不同, peek仅仅的瞥一眼栈顶的元素, 并不需要将这个元素从栈顶弹出 -
isEmpty()
:如果栈里没有任何元素就返回true
,否则返回false
。直接判断数组中的元素个数是为0, 为0返回true, 否则返回false -
size()
:返回栈里的元素个数。这个方法和数组的length
属性很类似。直接获取数组的长度即可.(也可以使用链表作为栈的顶层实现)
-
栈的使用案例
封装一个十进制转二进制的方法
function dec2bin(decnum) {
var sta1 = new Stack()
while (decnum > 0) {
sta1.push(decnum % 2)
decnum = Math.floor(decnum / 2)
}
var str = ""
while (sta1.isEmpty() != true) {
str += sta1.pop()
}
return str
}
测试代码
alert(dec2bin(10))
alert(dec2bin(233))
alert(dec2bin(1000))