我对栈的学习
因为是个新手,所以都是最简单的知识学习梳理。
什么是栈
数组是计算机科学中最常用的数据结构,是数据元素的集合。有时候我们需要一种添加或者删除元素时更可控的数据结构,他们就是队列和栈。
队列是遵从先进先出(FIFO)原则的一组有序的项,队列在尾部添加新元素,并从顶部移除元素。这里不先详细说明。
栈是一种遵从后进先出(LIFO)原则的有序集合,新添加的或者待删除的元素都保留在栈的末尾,称作栈顶,另一端叫做栈底。新元素都在栈顶。
栈也被用在编译语言的编译器和内存中保存变量、方法调用等。
栈的学习
栈的创建
创建一个类来表示栈。
function Stack() {
//各种属性和方法的声明
}
需要一种数据结构来保存栈里的元素,这里选择数组。
var items = [];
栈的基本操作
入栈方法:添加元素到栈,这里要注意添加到栈的元素只能到栈顶,也就是栈的末尾。
this.push = function (element) {
items.push(element);
}
出栈方法:移除栈里的元素,注意移除的是最后添加进去的元素。
this.pop = function () {
return items.pop();
}
对于栈来说只能用push和pop方法来进行添加和删除元素。
获取栈顶元素:我们想知道最后添加的元素是什么
this.peek = function () {
return items[items.length - 1];
}
别忘了这里我们使用数组来存储栈内的元素
判断栈空:栈为空返回true。
this.isEmpty = function () {
return items.length == 0;
}
对于集合,最好是使用size来代替length,这里我们简单了。
清空栈:移除栈内的所有元素,把栈清空
this.clear = function () {
items = []; //最简单的方式
}
栈的使用
首先需要初始化Stack类,然后验证一下栈是否为空
var stack = new Stack();
console.log(stack.isEmpty()); //true,此时还没有添加元素
然后添加元素入栈
stack.push(8);
stack.push(4);
获得最后添加的元素
console.log(stack.peek()); //4,因为4是最后被添加的元素
再添加一个元素
stack.push(11);
console.log(stack.size()); //输出3,此时栈里有3个元素
console.log(stack.isEmpty()); //false,此时栈里已经有元素了
移除两个元素
stack.pop();
stack.pop();
console.log(stack.size()); //1,此时只剩下一个元素
进制的转换
10进制转换为其他进制通常都是整除法。(可以自行搜索进制转换时的方法以及形式)
/**
* [数字,转换成相应进制的进制数]
* @param {[Number]} decNumber [想转的数]
* @param {[Number]} base [想转的进制]
* @return {[Number]} [转换进制后的数]
*/
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()) {
//这里通过digits的下标来获得相应字符。比如pop出7,这里digits[7]就是7,pop出16,这里digits[16]就是F
baseString += digits[remStack.pop()];
}
return baseString;
}
baseConverter(100345, 2); //11000011111111001
baseConverter(100345, 8); //303771
baseConverter(100345, 16); //187F9
下一篇简单的学习队列。。。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。