手动实现数据结构-栈结构

166 阅读1分钟

手动实现数据结构-栈结构

1.栈结构

  • 是一种受限的线性结构。

  • 特点:先进后出

2.使用TS实现

//封装一个栈  使用泛型类
class ArrayStack<T=any>{//给一个默认值为any类型
//定义一个数组,用于存储元素
private data:T[]=[]
//push:将元素压入栈中
push(e:T):void{
  this.data.push(e)
}
//pop方法:将栈顶的元素弹出栈(返回出去并从栈顶移除)   
pop():T|undefined{
  return this.data.pop()//pop返回的是删除的元素
}
//peek方法:看一眼栈顶元素
peek():T|undefined{
  return this.data[this.data.length-1]
}
//isEmpty
isEmpty():boolean{
  return this.data.length===0
}
size():number{
  return this.data.length
}
}

3.使用JS实现

// 栈类
    function Stack() {
        // 栈中的属性
        var items = []

        // 栈相关的方法
        // 压栈操作
        this.push = function (element) {
            items.push(element)
        }
        // 出栈操作
        this.pop = function () {
            return items.pop()
        }
        // peek操作
        this.peek = function () {
            return items[items.length - 1]
        }
        // 判断栈中的元素是否为空
        this.isEmpty = function () {
            return items.length == 0
        }
        // 获取栈中元素的个数
        this.size = function () {
            return items.length
        }
    }

4.相关题目

  1. 十进制转二进制

    function decToBinary(decimal:number):string{
      let stack=new ArrayStack<number>()
      
      //while:不知道循环次数,知道循环终止条件。for:知道循环次数
      while(decimal>0){
        let result=decimal%2
        stack.push(result)
        decimal=Math.floor(decimal/2)
      }
      let str=''
      while(!stack.isEmpty()){
        str+=stack.pop()
      }
      return str
    }
    
  2. 有效的括号

function isVaild(str:string):boolean{
  //创建一个栈结构 用于把存放右括号
  let stack=new ArrayStack()
  //遍历字符串中每一个字符,当遇到一个左括号就往栈里面添加对应的右括号。当遇到右括号时,就能让它与栈弹出的元素(刚添加进去的)比较,如果不相等,就说明没有成对出现。重要的就是一一对应(相应的左括号对应相应的右括号)。
  for(let i=0;i<str.length;i++){
    let item=str[i]
    switch(item){
      case '(':
        stack.push(')')
        break;
      case '{':
        stack.push('}')
        break;
      case '[':
        stack.push(']')
        break;
      default:
        if(item!==stack.pop())return false
        break;
    }
  }
  //只有栈为空的时候,表明括号既一一对应又是双数
  return stack.isEmpty()

}