JS中的算法与数据结构——栈(Stack)

339 阅读2分钟

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 的情况)

  1. 最高位为 n % b , 直接压入栈;
  2. 使用 Math.floor(n / b) 来代替 n ;
  3. 重复上面的步骤,直到 n 为 0 ,并且没有余数;
  4. 以此将栈内元素弹出,直到栈空,并依次将这些元素排列,就得到了转换后的形式
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;
}