javascript数据结构——栈

//数组模拟栈
class Stack {
    constructor() {
        this.items = []
    }
    push(element) {  //添加元素
        this.items.push(element)
    }
    pop() {   //删除元素
        return this.items.pop()
    }
    clear() {  //清空栈
        this.items = []
    }
    peek() {  //返回栈顶元素
        return this.items[this.items.length - 1]
    }
    isEmpty() {  //判断栈是否为空
        return this.items.length === 0
    }
    size() {  //栈大小
        return this.items.length
    }
}
//对象模拟栈
class Stack {
    constructor() {
        this.items = {}
        this.num = 0 //记录栈大小
    }
    push(element) {   //添加元素
        this.items[this.num] = element
        this.num++
    }
    size() {  //栈大小
        return this.num
    }
    pop() {  //删除元素
        if (this.num === 0) {
            return undefined
        }
        this.num--
        const result = this.items[this.num]  //保存结果以返回
        delete this.items[this.num]
        return result
    }
    clear() {  //清空栈
        this.items = {}
        this.num = 0
    }
    peek() {  //返回栈顶元素
        if (this.num === 0) {
            return undefined
        }
        return this.items[this.num]
    }
    isEmpty() {  //判断栈是否为空
        return this.num === 0
    }
    toString() {   //字符串化
        if (this.num === 0) {
            return ''
        }
        let stackString = `${this.items[0]}`
        for(let i=1;i<this.num;i++){
            stackString = `${stackString},${this.items[i]}`
        }
        return stackString
    }
}

栈相关算法习题(力扣easy+middle题)

1.有效括号(力扣20)

var getObjectKey = (object, value) => {  //根据值名获取键名
    return Object.keys(object).find(key => object[key] === value);
};
var isValid = function (s) {
    let stack = [];
    const obj = {
        "(": ")",
        "[": "]",
        "{": "}"
    }
    for (let i = 0; i < s.length; i++) {
        if (Object.values(obj).includes(s[i])) {   //所有值名[ ')', ']', '}' ]
            //判断stack中最后一项是否等于当前值名对应的键名
            if (stack[stack.length - 1] === getObjectKey(obj, s[i])) {
                //删除键名
                stack.pop()
            } else {
                return false
            }
        } else {
            //向stack推入键名
            stack.push(s[i])
        }
    }
    if (stack.length === 0) {
        return true
    } else {
        return false
    }
};

2.最小栈(力扣155)

var MinStack = function() {
    this.items = []
};


MinStack.prototype.push = function(val) {
    this.items.push(val)
};


MinStack.prototype.pop = function() {
    return this.items.pop()
};


MinStack.prototype.top = function() {
    return this.items[this.items.length-1]
};


MinStack.prototype.getMin = function() {
    let min = this.items[0]
    for(let i=0;i<this.items.length;i++){
        min = Math.min(min,this.items[i])
    }
    return min
};

 

3.棒球比赛(力扣682)

var calPoints = function (ops) {
    if (ops.length === 1) {
        return ops[0]
    }
    if (ops.length === 2) {
        return ops[0] + ops[1]
    }
    let num = 0
    let stack = []
    for (let i = 0; i < ops.length; i++) {
        if (ops[i] === "C") {
            stack.pop()
        } else if (ops[i] === 'D') {
            stack.push(stack[stack.length - 1] * 2)
        } else if (ops[i] === '+') {
            stack.push(stack[stack.length - 1] + stack[stack.length - 2])
        } else {
            ops[i] = Number(ops[i])
            stack.push(ops[i])
        }
    }
    stack.forEach(value => {
        num += value
    })
    return num
};

4.删除字符串中所有重复项(力扣1047)

var removeDuplicates = function (s) {
    let stack = [];
    for (let i = 0; i < s.length; i++) {
        if (!stack.includes(s[i])) {
            stack.push(s[i])
        } else if (stack.includes(s[i]) && stack[stack.length - 1] === s[i]) {
            stack.pop(stack[stack.length - 1])
        } else {
            stack.push(s[i])
        }
    }
    let result = stack.toString().replace(/[,]/g, '')
    return result
};

5.整理字符串(力扣1544)

var makeGood = function (s) {
    if (s.length === 1) {
        return s[0]
    }
    let stack = []
    stack[0] = s[0]
    console.log(stack)
    for (let i = 1; i < s.length; i++) {  //l e 
        if (s[i] === stack[stack.length - 1]) {
            stack.push(s[i])
        } else if (s[i].toUpperCase() === stack[stack.length - 1] || s[i].toLowerCase() === stack[stack.length - 1]) {
            stack.pop()
        } else {
            stack.push(s[i])
        }
    }
    let result = stack.toString().replace(/[,]/g, '')
    return result
};

6.验证栈序列(946-middle)

var validateStackSequences = function (pushed, popped) {
  let stack = [];
  var clear_stack = function () {
    while (stack[stack.length - 1] === popped[0] && stack.length !== 0) {
      stack.pop()
      popped.shift()
    }
  }
  for (let i = 0; i < pushed.length; i++) {
    stack.push(pushed[i])
    clear_stack()
  }
  return stack.length === 0
};

其它

任意进制转换算法

const baseConverter = function (decNumber, base) {
  let stack = [];
  let digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  let rem;
  let str = "";
  if (base < 2 || base > 36) {
    return ''
  }
  while (decNumber > 0) {
    rem = Math.floor(decNumber % base);
    stack.push(rem);
    decNumber = Math.floor(decNumber / base);
  }
  while (stack.length !== 0) {
    str += digits[stack.pop()]
  }
  return str
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值