js 数据结构(一):栈

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈顶。

现实生活中就有很多栈的例子。如下图的书本,这一摞书如果要取肯定是先去最上面的那一本,但它是最后一个放上去的,也就是栈顶的元素都是待添加或是待删除的。这就是后进先出的实际例子。

栈的创建:

我们创建一个类来表示栈。先声明:

function Stack() {

  //各种属性和方法的声明

}

然后我们需要一种数据结构来保存栈里的元素:

var items = [];

接下来,我们给栈声明一些方法:

  • push(element):添加一个或几个新元素到栈顶
  • pop():移除栈顶的元素,同时返回被移除的元素
  • peek():返回栈顶的元素,不对栈做任何修改
  • isEmpty():判断栈里有无元素
  • clear():移除栈里的所有元素
  • size():返回栈里的元素个数。和数组length属性类似。

我们利用这些方法来实现一个栈:

// 栈
function Stack() {
  var items = [];
  // 添加一个或几个新元素到栈顶
  this.push = function (element) {
    items.push(element);
  };
  // 移除栈顶的元素,同时返回被移除的元素
  this.pop = function () {
    return items.pop();
  };
  // 返回栈顶的元素
  this.peek = function () {
    return items[items.length - 1];
  };
  // 判断栈里有无元素
  this.isEmpty = function () {
    return items.length === 0;
  };
  // 返回栈里的元素个数
  this.size = function () {
    return items.length;
  };
  // 移除栈里的所有元素
  this.clear = function () {
    items = [];
  };

  this.print = function () {
    console.log(items.toString());
  };
}

我们来测试下:

var stack = new Stack();
console.log(stack.isEmpty()); // true
stack.push(5);
stack.push(8);
console.log(stack.peek()); // 8 
stack.push(11); 
console.log(stack.size()); // 3 
stack.pop(); 
console.log(stack.size()); // 2 
stack.print(); // 5,8

实例

十进制转二进制

// 十进制转二进制
function divideBy2(decNumber) {
  var remStack = new Stack(),
    rem,
    binaryString = "";
  while (decNumber > 0) {
    rem = Math.floor(decNumber % 2);
    remStack.push(rem);
    decNumber = Math.floor(decNumber / 2);
  }
  while (!remStack.isEmpty()) {
    binaryString += remStack.pop().toString();
  }
  return binaryString;
}

测试

console.log(divideBy2(233));  // 11101001 
console.log(divideBy2(10));  // 1010 
console.log(divideBy2(1000));   // 1111101000

十进制转任意进制

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;
}

测试

console.log(baseConverter(100345, 2)); // 11000011111111001
console.log(baseConverter(100345, 8));   // 303771
console.log(baseConverter(100345, 16));   // 187F9

参考链接: 学习JavaScript数据结构与算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值