126 阅读2分钟

栈是和列表类似的一种数据结构,但高效,只能在栈顶添加和删除,所以操作快。

1.对栈的操作

栈是一种特殊的列表,栈内的元素只能通过列表的一端(栈顶)访问,后入先出的数据结构。(LIFO)

任何不在栈顶的元素都无法访问。

  • 入栈 push()

  • 出栈 pop()

  • 预览栈顶的元素 peek(),返回栈顶元素,不删除。top记录栈顶元素的位置

  • clear()清除栈内所有元素

    length属性记录栈内元素的个数,empty属性,用以表示栈内是否含有元素

2.栈的实现

存储数据的底层数据结构:这里采用数组。

定义Stack类的构造函数

function Stack(){
	this.dataStore = [];//用数组dataStore保存栈内元素,初始化为空数组
	this.top = 0;//记录栈顶位置,初始化为0
	this.push = push;
	this.pop = pop;
	this.peek = peek;
	this,clear= clear;
	thia.length = length;
}

function push(element){
	this.dataStore[this.top++] = element;
}

function pop(){
	return this.dataStore[--this.top];
}

function peek(){
	return this.dataStore[this.top-1];
}
//如果对一个空栈调用peek()方法,结果为undefined

function length(){
	return this.top;
}

function clear(){
	this.top=0;
}

3.使用Stack类

  1. 数制之间的相互转换

    将数字n转换为以b为基数的数字

    1. 最高位为n%b,将此位压入栈。

    2. 使用n/b代替n。

    3. 重复步骤1和2,直到 n等于0,且没有余数。

    4. 持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符串形式。

    PS:此算法只针对基数为2~9的情况。

    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;
    }
    
    1. 判断给定字符串是否是回文

      回文:从前往后写和从后往前写都是一样的

      比较将字符串压入栈之后持续弹出栈组成的薪资串与原字符串是否相等。

      function isPalindrome(word){
      	var s = new Stack();
      	for(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;
          }
      }
      
      1. 递归演示

        阶乘