什么是栈 ?
一种后进先出(LIFO)的数据结构
如图所示这就好比一个单向开口的网球筒,先放入网球筒的在筒底需要最后才能拿出来。后放入球筒的先拿出来。栈的数据存储就是以这种方式实现
push()
入栈
pop()
出栈
peek()
查看栈顶
这几种栈的底层操作方法,我们可以依照数组的使用模拟出来,这样就很容易理解程序概念中的栈操作
数组模拟栈
因为JavaScript比较高级,自带了 push()
和 pop()
两个方法,这样理解起来变得更加容易
数组的push()
将数据添加到栈顶, pop()
则取出最后一项数据。模拟出栈的存入和取出操作
以下的类便是使用数组模拟出完整的栈操作
/**
* 模拟栈创建的类
* */
var Stack = function () {
// 定义私有变量 外部不能操作访问,保护栈规则
var items = []
// this.items 外部可以通过实例化操作到
// 栈的存入操作
this.push = function (el) {
items.push(el)
}
// 栈的取出操作
this.pop = function (el) {
return items.pop()
}
// 获取元素
this.getItems = function () {
return items
}
// 检查栈顶
this.peek = function () {
return items[items.length - 1]
}
// 检查是否为空栈
this.isEmpty = function () {
return items.length === 0
}
// 清空栈
this.clear = function () {
items = []
}
// 栈元素个数
this.size = function () {
return items.length
}
}
使用栈操作十进制转二进制
余数法:采用连续除2纪录余数的方法,直到除数小于2。将最终结果和余数连接得出二进制数据
10/2 = 5 余
0
5/2 = 2 余1
2/2 =1
余0
红字结果 :1010
/**
* 利用封装的Stack()
* 实现十进制转二进制
* 利用余数法进行转换
*/
var s = new Stack()
var decimalToBinary = function (number) {
while (number > 0) {
s.push(number % 2)
number = Math.floor(number / 2)
}
return getBinary()
}
var getBinary = function () {
var binStr = ''
while (!s.isEmpty()){
binStr += s.pop()
}
return binStr
}