栈的完成
完成一个栈,燃眉之急是决议存储数据的底层数据结构。这里采纳的是数组。 我们的完成以定义 Stack 类的组织函数最先:
function Stack() {
this.dataStore = [];
this.top = 0;
this.push = push;
this.pop = pop;
this.peek = peek;
}
我们用数组 dataStore 保留栈内元素,组织函数将其初始化为一个空数组。变量 top 纪录 栈顶位置,被组织函数初始化为 0,示意栈顶对应数组的肇端位置 0。假如有元素被压入 栈,该变量的值将随之变化。
先来完成 push() 要领。当向栈中压入一个新元素时,须要将其保留在数组中变量 top 所对 应的位置,然后将 top 值加 1,让其指向数组中下一个空位置。代码以下所示:
function push(element) {
this.dataStore[this.top++] = element;
}
这里要特别注意 ++ 操作符的位置,它放在 this.top 的背面,如许新入栈的元素就被放在 top 的当前值对应的位置,然后再将变量 top 的值加 1,指向下一个位置。
pop() 要领正好与 push() 要领相反——它返回栈顶元素,同时将变量 top 的值减 1:
function pop() {
return this.dataStore[--this.top];
}
peek() 要领返回数组的第 top-1 个位置的元素,即栈顶元素:
function peek() {
return this.dataStore[this.top-1];
}
假如对一个空栈挪用 peek() 要领,效果为 undefined。这是由于栈是空的,栈顶没有任何
元素。
有时候须要晓得栈内存储了多少个元素。length() 要领经由过程返回变量 top 值的体式格局返回栈 内的元素个数:
function length() {
return this.top;
}
末了,能够将变量 top 的值设为 0,轻松清空一个栈:
function clear() {
this.top = 0;
}
代码归结
function Stack() {
this.dataStore = [];
this.top = 0;
this.push = push;
this.pop = pop;
this.peek = peek;
this.clear = clear;
this.length = length;
}
function push(element) {
this.dataStore[this.top++] = element;
}
function peek() {
return this.dataStore[this.top-1];
}
function pop() {
return this.dataStore[--this.top];
}
function clear() {
this.top = 0;
}
function length() {
return this.top;
}
栈的运用
数制间的互相转换
能够应用栈将一个数字从一种数制转换成另一种数制。假定想将数字 n 转换为以 b 为基数的数字,完成转换的算法以下。
最高位为 n % b,将此位压入栈。
运用n/b替代n。
反复步骤 1 和 2,直到 n 即是 0,且没有余数。
延续将栈内元素弹出,直到栈为空,顺次将这些元素分列,就获得转换后数字的字符
串情势。
运用栈,在 JavaScript 中完成该算法就是小菜一碟。下面就是该函数的定义,能够将数字 转化为二至九进制的数字:
function mulBase(num, base) {
var s = new Stack();
do {
s.push(num % base);
num = Math.floor(num /= base);
} while (num > 0);
var converted = "";
while (s.length() > 0) {
converted += s.pop();
}
return converted;
}
后话
固然,学好前端,你还须要关注一个民众号!——逐日前端
列位兄弟姐妹,共勉!