JS中的算法与数据结构——栈(Stack)
定义
栈,又叫堆栈,是和列表类似的一种数据结构,但是却更高效,因为栈内的元素只能通过栈顶访问,数据只能在栈顶添加或删除,遵循 先入后出(LIFO,last-in-first-out) 的原则。
栈的属性和方法
类型 | 描述 | push() | 入栈 | pop() | 出栈 | peek() | 查看栈顶元素 | length() | 栈长度 | clear() | 清空站内元素 | top | 属性,查看当前栈顶位置 |
---|
栈的实现
function Stack () {
this.dataStore = []; //初始化为空
this.top = 0; //记录栈顶位置
this.pop = function() { //出栈
return this.dataStore[--this.top];
};
this.push = function(element) { //入栈
this.dataStore[this.top++]=element;
};
this.peek = function() { //查看栈顶元素
if( this.top > 0 ) return this.dataStore[this.top-1];
return 'Empty';
};
this.length = function() { //查看栈内元素总数
return this.top;
};
this.clear = function() { //清空栈
delete this.dataStore;
this.dataStore = [];
this.top = 0;
};
}
案例1:实现数制间的相互转换
利用栈将一个数字从一种数制转换成另一种数制。例如将数字 n 转换成以 b 为基数的数字,可以采用如下算法(该算法只针对基数为 2-9 的情况)
- 最高位为 n % b , 直接压入栈;
- 使用 Math.floor(n / b) 来代替 n ;
- 重复上面的步骤,直到 n 为 0 ,并且没有余数;
- 以此将栈内元素弹出,直到栈空,并依次将这些元素排列,就得到了转换后的形式
function baseConversion(num , base) {
var s = new Stack();
while(num!==0) {
s.push(num % base);
num = Math.floor(num/base);
}
var converted = '';
while (s.length() > 0){
converted += s.pop();
}
return converted;
}
案列2:判断一个字符串是不是回文
回文是指一个字符串,从前往后写和从后往前写结果都是一样的,比如单词 'level' , 'racecar',就是回文,数字 1001 也是回文。 我们把字符串从左到右依次压入栈,这样,栈中保存了该字符串反转后的字符,我们再依次出栈,通过比较出栈后的字符串是否与原字符串是否相等,就可判断该字符串是否是回文。
//回文判断
function isPalindrome ( word ) {
var s = new Stack();
for( var i = 0 ; i < word.length ; i ++ ){
s.push( word[i] );
}
var rword = '';
while( s.length() > 0 ){
rword += s.pop();
}
if( word == rword ){
return true;
}else{
return false;
}
}
console.log( isPalindrome('level') ) // true
console.log( isPalindrome('1001') ) // true
console.log( isPalindrome('word') ) // false
另一种实现
function isPalindrome ( word ){
return String(word).split('').reverse().join('') == word ? true : false;
}
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!