用栈实现括号匹配,并返回括号不匹配或缺失位置

基本思路:

  • 使用用两个栈,一个存储所有字符,一个只存储括号
  • s1入栈所有字符
  • 而遇到前括号,入栈s2;遇到后括号,查看s2最顶部的括号是否匹配
  • 若匹配则让s2出栈该后括号匹配的前括号,即最顶部的括号
  • 若不匹配,则返回括号不匹配或缺失的位置

stack.js:

// stack.js
class Stack {
    constructor(){
        // dataStore 保存所有数据
        this.dataStore=[];
        // top 指示可以添加数据的“位置”
        this.top=0;
    }
    // 当然定义栈自己的push 方法,并让顶指针加一
    push(elem){
        this.dataStore[this.top++]=elem;
    }
    // 返回最顶部的值
    peek(){
        return this.dataStore[this.top-1]
    }
    // 出栈一个元素,即最顶部的值。并让指针减一,注意是先用后减
    pop(){
        return this.dataStore[--this.top]
    }
    // 因为无论添加值、访问值、还是出栈值,都是根据this.top
    // 就像数组清空,直接令length=0
    clear(){
        this.top=0
    }
    length(){
        return this.top;
    }
}

module.exports=Stack

括号匹配:

const Stack = require('./stack.js')

function isMatch(str) {
    const s1 = new Stack();  // s1 存储所有字符;s2 只存储括号
    const s2 = new Stack();
    let nums = '';          // 方便输出完整数字
    const sign1='+-*/()[]{}';   
    const sign2='(){}[]';
    for (let i = 0; i < str.length; i++) {
        if (sign2.indexOf(str[i]) > -1){    // 先判断括号
            switch (str[i]) {
                case '(':
                case '[':
                case '{': s2.push(str[i]);break;
                case ')':
                    if (s2.peek() != '(') {
                        return `在${s1.peek()}后括号不匹配`
                    };
                    s2.pop()
                    break;
                case ']':
                    if (s2.peek() != '[') {
                        return `在${s1.peek()}后括号不匹配`
                    };
                    s2.pop()
                    break;
                case '}':
                    if (s2.peek() != '{') {
                        return `在${s1.peek()}后括号不匹配`
                    };
                    s2.pop()
                    break;
            }
        }
        if(sign1.indexOf(str[i])>-1){   // 其它字符与数字分开讨论
            s1.push(str[i]);
            continue;
        }
        while ('0' <= str[i] && str[i] <= '9' || str[i] == '.') {
            nums += str[i]
            i++;
        }
        i--;
        s1.push(nums)
        nums='';
    }
    return s2.length() > 0 ? `在末尾处,${s1.peek()}后括号不匹配` : '括号匹配';
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值