栈的出入js实现_数据结构:用JS实现栈

首先,我们先介绍一下数据结构栈的一些特点。

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

接下来,就是用JavaScript来完成栈的实现。

创建一个类来表示栈。

function Stack () {} //先声明这个类

复制代码

接下来,我们需要一种数据结构来保存栈里的元素。这里选择数组来保存栈里的元素,方便下面实现栈内部方法。

var items = [];

复制代码

当然,我们还需要为这个栈声明一些方法。

push(element):添加一个新元素到栈顶。

pop():移除栈顶的元素,同时返回被移除的元素。

peek():返回栈顶的元素,不对栈做任何修改。

isEmpty():如果栈里没有任何元素就返回true,否则返回false。

clear():移除栈里的所有元素。

size():返回栈里的元素个数。

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() );

}

}

复制代码

到这,我们会创建了一个栈。

下面,我再给大家介绍一个基于栈的一个算法

进制转换算法

首先,我们先来试试从十进制到二进制

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();

}

retuan binaryString;

}

复制代码

我们拿10来走一遍程序是这样的

10 / 2 = 5 ->0

5 / 2 = 2 ->1

2 / 2 = 1 ->0

1 / 2 = 0.5 ->1

这时,栈里元素顺序和上面一样,输出时遵循先进后出原则为1010

然后我们把这个算法修改一下:从十进制到十六进制以内进制

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()];

}

retuan baseString;

}

复制代码

这里只将进制控制在十六进制以内,余数是0到9之间的数字加上A(10)、B(11)、C(12)、D(13)、E(14)、F(15)。

我们通过digits字符串和栈内添加余数对应关系来实现。

同样,我们拿100345转换为十六进制来走一下程序:

100345 / 16 = 6271 ->9

6271 / 16 = 391 ->15

391 / 16 = 24 ->7

24 / 16 = 1 ->8

1 / 16 = 0 ->1

digits[9] = 9

digits[15]= F

digits[7] = 7

digits[8] = 8

digits[1] = 1 ->187F9

吼吼,栈就先到在这里了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值