数据结构-栈

1. 实现栈[push, pop, top, size, clear, isEmpty]

/**
 * 数组实现栈[push, pop, top, size, clear, isEmpty]
 */
class Stack {
    constructor() {
       this.items = []
    }

    push (data) {
        this.items.push(data)
    }

    pop () {
        let popItem = this.items.pop()
        return popItem
    }

    top () {
        return this.items[this.items.length - 1]
    }

    size () {
        return this.items.length
    }

    clear () {
        this.items = []
    }

    isEmpty () {
        return this.items.length === 0
    }
}

2. 栈常见算法

(1). 左右括号匹配问题:

思路:将'('入栈,遇到')',进行判断栈是否是空,为空则不匹配,不为空则出栈,最后看栈是否为空即可

function isMatch(str) {
    const stack = new Stack()
    for(let i = 0; i < str.length; i++) {
        let item = str[i]
        if (item === '(') {
            stack.push(item)
        } else if(item === ')') {
            if (stack.isEmpty()) {
                return false
            } else {
                stack.pop()
            }
        }
    }

    if(stack.isEmpty()) {
        return true
    } else {
        return false
    }
}

let str1 = '(dsd())'
let str2 = '(dsd()))'
console.log(isMatch(str1))
console.log(isMatch(str2))

(2).逆波兰表达式:(计算后缀表达式(逆波兰表达式) ['1', '+', '10', '/', '2']  ----> ['1', '10', '2', '/', '+'])

思路: 不是加减乘除则入栈,遇到加减乘除则出栈两个与改运算符运算得到结果后再入栈

function isSuffixExp (suffixArrs) {
    let stack = new Stack()
    for (let i = 0; i < suffixArrs.length; i++) {
        const item = suffixArrs[i]
        if (['+', '-', '*', '/'].includes(item)) {
            let firstValue = stack.pop()
            let secondValue = stack.pop()
            // '10/2'
            let calExp = secondValue + item + firstValue
            let calValue = parseInt(eval(calExp))
            stack.push(calValue)
        } else {
            stack.push(item)
        }
    }

    return stack.pop()
}
console.log(isSuffixExp(['1', '10', '2', '/', '+']))

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值