栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。
新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
基本概念
我们将创建一个类来表示栈。让我们从基础开始,先声明这个类:
function Stack() {
//各种属性和方法的声明
}
声明数组来保存栈里的元素:
var items = [];
接下来,要为我们的栈声明一些方法。
push(element(s))
:添加一个(或几个)新元素到栈顶。pop()
:移除栈顶的元素,同时返回被移除的元素。peek()
:查看栈顶的元素,不对栈做任何修改。isEmpty()
:如果栈里没有任何元素就返回true
,否则返回false
。clear()
:移除栈里的所有元素。size()
:返回栈里的元素个数。这个方法和数组的length
属性很类似。
代码实现
// 封装栈类
function Stack(){
// 栈中的元素
let items =[];
// 1.push():将元素压入栈
Stack.prototype.push = element => {items.push(element)};
// 2.pop():从栈中取出元素
Stack.prototype.pop = () => items.pop();
// 3.peek():查看栈顶元素
Stack.prototype.peek = () => items[this.items.length - 1];
// 4.isEmpty():判断栈是否为空
Stack.prototype.isEmpty = () => items.length == 0;
// 5.size():移除栈里所有的元素,把栈清空
Stack.prototype.clear = () => items = [];
// 6.clear():对于集合,最好用size代替length
Stack.prototype.size = () => items.length;
// 7.toString():以字符串形式输出栈内数据
Stack.prototype.toString = () => items.reduce((a,b)=>a + ' ' +b);
// console.log(items.toString()) 打印结果是 1,3,5
// 可以自定义组合格式 打印结果是 "1 3 5"
}
使用实例
利用栈进行进制转换
//封装函数:将十进制转成二进制(十转二的运算最后倒叙取余的特点符合栈'先进后出')
let dec2bin = decNumber => {
//1.定义一个栈对象,保存余数
var remStack = new Stack()
// 2.循环操作
while(decNumber > 0){
// 2.1.获取余数并放入栈中
remStack.push(decNumber % 2)
// 2.2.获取整除后的结果作为下一次运算的数字(floor:向下取整)
decNumber = Math.floor(decNumber / 2)
}
// 3.从栈中取出0和1
let binaryString = '';
while (!remStack.isEmpty()){ //{5}
binaryString += remStack.pop();
}
return binaryString;
}
十进制转其他进制
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;
}
5 的阶乘递归示例
// 递归
function factorial(n) {
if (n === 0) {
return 1;
}
else {
return n * factorial(n-1);
}
}
// 栈方法
function fact(n) {
var s = new Stack();
while (n > 1) {
s.push(n--);
}
var product = 1;
while (s.length() > 0) {
product *= s.pop();
}
return product;
}