最近复习了一遍数据结构,记录学习内容。
什么是栈?
栈是一种遵循**后进先出(LIFO)**原则的有序集合。栈的两端分别叫做:栈顶,栈底。最先入栈的元素被压入栈底,新添加的元素会保持在栈顶。在栈中,越先入栈的元素越接近栈底,越后入栈的元素越靠近栈顶。
这个结构类似于一个水桶,先放进去的东西被压在下面,而后放进去的东西反而在顶部,是最先被拿出来的。
这里A先入栈,一定是最后出栈的,F最后入栈,处于栈顶,一定最先出栈。
创建一个栈
(这里没有考虑私有属性)
class Stack {
constructor() {
//存如栈的元素以键值对的形式保存到_items中
this._items = {}
this._count = 0
}
//方法...
}
push(element)方法,向栈中压入元素
Stack.prototype.push = function(element) {
//元素存入items对象中,_count为键,值为element,存储之后count+1表示长度
this._items[this._count++] = element
}
size()方法,返回栈的大小
Stack.prototype.size = function() {
return this._count
}
isEmpty()方法,判断栈是否为空,为空则返回true否则返回false
Stack.prototype.isEmpty = function() {
//长度为0返回false
return this._count === 0
}
pop()方法,移除栈顶元素,并返回移除的元素
Stack.prototype.pop = function() {
if (this.isEmpty()) {
return undefined
}
this._count--
const result = this._items[this._count]
delete this._items[this._count]
return result
}
peak()方法,该方法会返回栈顶元素,用来查看栈顶元素
Stack.prototype.peak = function() {
if (this.isEmpty()) {
return undefined
}
return this._items[this._count - 1]
}
clear()方法,清空栈
Stack.prototype.clear = function() {
this._items = {}
this._count = 0
}
toString()方法,返回栈内容的字符串形式
Stack.prototype.toString = function() {
if (this.isEmpty()) {
return ''
}
let result = this._items[0]
for (let i = 1; i < this._count; i++) {
result += "," + this._items[i]
}
return result
}
用栈来解决问题
进制转换算法
可以将指定数字转换成任意进制的数字,比如将指定数字10转换成2进制数字:
function decimalToBinary(decNumber) {
let stack = new Stack()
let num = decNumber
//保存余数
let rem = 0
while (num > 0) {
rem = Math.floor(num % 2)
stack.push(rem)
//保存商,下一轮还要用商继续除
num = Math.floor(num / 2)
}
let result = ''
let len = stack.size()
for (let i = 0; i < len; i++) {
result += stack.pop()
}
return result
}