数据结构:用JS实现栈

来源:互联网 发布:mac网游加速器 编辑:程序博客网 时间:2024/06/01 09:36

首先,我们先介绍一下数据结构栈的一些特点。
栈是一种遵从先进后出(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

吼吼,栈就先到在这里了
喜欢的话就顶一下吧~

原创粉丝点击