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