(堆栈的应用)JS实现括号匹配问题
1.首先要有一个运行js的编译环境,然后有个编辑器,本人使用的是VsCode,看个人喜好,能运行js代码就行。
2,栈遵循 “先进后出” 的原则(如果对栈不了解的可以自行百度,这里就不详细说明了)。
示例:给定一个只包括“{”,“}”,“(”“)”,“[" ,"]’'的字符串,判断字符串是否有效。有效字符串需要满足:
1,左括号必须用相同类型的右括号闭合
2,左括号必须以正确的顺序闭合(不得出现嵌套)
注意空字符串可被认为是有效的字符串;
示例1:
- 输入:’()’
- 输出:true
示例2:
- 输入:’( ) [ ]{ }’
- 输出:true
示例3:
- 输入:’{ ]’
- 输出:false
示例4:
- 输入:’( [ ) ]’
- 输出:false
示例5:
- 输入:’{ [ ] }’
- 输出:true
测试用例
首先我们来分析实现这个功能的原理:
- 字符串固定(字符串中可能包含空格)
- 成对出现
- 闭合顺序(最后一个出现的括号第一个闭合)===最先出现的括号最后一个闭合
解题思路
算法原理
- 用栈来模拟括号的顺序
- 可以创建一个对象,建立左右括号的对应关系,key为左括号,value为右括号
算法流程
- 遍历字符串的每一个字符
- 如果是左括号直接push入栈
- 如果是右括号,将栈顶的第一个元素取出来与当前的元素进行对比,如果不匹配,则return false ,如果匹配,则出栈
- 遍历完之后保证栈内的size(getSize())为空;
示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
// 定义栈的类
class Stack {
constructor() {
this.stack = [];
}
push(item) {
return this.stack.push(item);
}
pop() {
return this.stack.pop();
}
// 查询栈顶的元素
peek() {
return this.stack[this.getSize() - 1];
}
//返回栈的长度
getSize() {
return this.stack.length;
}
// 栈的非空判断
isEmpty() {
return this.getSize() === 0;
}
}
function testIsValid(str) {
// 以左右括号来建立一个对象,key为左括号,value为右括号
var Map = {
"{": "}",
"(": ")",
"[": "]",
};
//实例化一个栈
const myStack = new Stack();
//遍历str字符串
for (let v of str) {
if (Map[v]) {
myStack.push(v); //是左括号,入栈
} else if (Object.values(Map).includes(v)) {
// 右括号 将当前的元素和栈顶的第一个元素进行匹配
let last = myStack.pop();
if (v !== Map[last]) return false;
} else {
//这里排除的是空字符的情况,如果不是左右括号而是其他的空字符串或者非法字符的话,将终止本次循环,执行下一次循环
continue;
}
}
//遍历完成之后要保证栈内要为空
return myStack.getSize() === 0;
}
console.log(testIsValid("()")); //true
console.log(testIsValid("([ ) ]")); //false
console.log(testIsValid("([{ )]")); //false
console.log(testIsValid("()[ ]{}")); //true
console.log(testIsValid(" { ]")); //false
console.log(testIsValid("{ [ ] }")); //true
</script>
</body>
</html>