学习JavaScript数据结构与算法数据总结。
1. 定义
栈是一种遵循后进先出(LIFO)原则的有序集合。新添加的元素保存在栈顶,而最先添加的元素保存在栈底。
2. 栈实例
我们使用数组,来保存栈的元素。为栈声明一些方法:
- push(elements): 添加一个或多个新元素到栈顶
- pop(): 移除栈顶的元素,同时返回被移除的元素
- peek(): 获取栈顶的元素,不对栈做任何修改
- isEmpty(): 栈中元素不存在返回true,否则返回false
- clear(): 清除栈里的所有元素
- size(): 返回栈里的元素个数
function Stack() {
// 存储栈元素
var items = [];
this.push = (elements) => {
if ((typeof elements) === 'number') {
items.push(elements);
} else {
items.push(...elements);
}
};
this.pop = () => (items.pop());
this.peek = () => (items[items.length - 1]);
this.isEmpty = () => (items.length === 0);
this.clear = () => (items = []);
this.size = () => (items.length);
this.print = () => (console.log(items.toString()));
}
let stack = new Stack();
stack.push([1,2,3]);
console.log(stack.pop());
console.log(stack.size());
console.log(stack.print());
console.log(stack.isEmpty());
console.log(stack.clear());
console.log(stack.size(), stack.isEmpty());
3. 十进制转二进制
十进制转二进制:将十进制数和2整除(二进制满2进1),直到结果是0为止。

例如
10的二进制就是:1010,下面通过栈的方式编写10进制转2进制的函数:function divideBy2(decNumber) {
let stack = new Stack();
let binaryString = '';
// 取余数存放在stack中
while(decNumber / 2) {
let rem = Math.floor(decNumber % 2);
stack.push(rem);
decNumber = Math.floor(decNumber / 2);
}
console.log(stack.print())
// 遍历取出余数
while(!stack.isEmpty()) {
binaryString += stack.pop().toString();
}
return binaryString;
}
只需要改变一个地方。在将十进制转成二进制时,余数是0或1;在将十进制转成八进制时,余数是0到8之间的数;但是将十进制转成16进制时,余数是0到8之间的数字加上A、 B、 C、D、 E和F(对应10、 11、 12、 13、 14和15)
function baseConverter(decNumber, base){
var remStack = new Stack(),
rem,
baseString = '',
// 存储对应的余数
digits = '0123456789ABCDEF';
while (decNumber > 0){
rem = Math.floor(decNumber % base);
remStack.push(rem);
decNumber = Math.floor(decNumber / base);
}
while (!remStack.isEmpty()){
baseString += digits[remStack.pop()];
}
return baseString;
}