JavaScript数据结构之 —— 02构造栈

栈被称为一种后入先出(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值