本次分享主要是通过栈的思想解决问题
20. 有效的括号:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
有效的括号的特点是成对出现的,如果单个肯定是无效的,或者错乱了如"[(])",都是无效的;为什么会想到用栈的思想去解决一个有效括号的问题呢?浏览器左右箭头,代表这后台和前进,这个也是用栈来存储url的,浏览器分别用了两个栈分别存储前进的url和后台的url;当然这个有效括号只需要一个栈,可以把左括号作为一个入栈标识,右括号作为出栈标识(并且出栈的括号能和该右括号匹配上的括号),当结束的时候栈是空的即是有效的括号;具体代码实现如下:
const isValid = function(s) {
const stack = []; // 存储左括号的栈
for(let i = 0;i<s.length;i++){
if(s[i] === '(' || s[i] === '{'|| s[i] === '['){
stack.push(s[i])
} else if(s[i] === ')'){
let x = stack.pop();
if(x !== '('){ // 遇到的)和栈顶匹配不是(就是无效括号
return false
}
} else if(s[i] === '}'){
let x = stack.pop();
if(x !== '{'){
return false
}
} else {
let x = stack.pop();
if(x !== '['){
return false
}
}
}
if(stack.length){ // 如果栈最后不是空的即有括号没有配对,即无效括号
return false
}
return true;
};
150. 逆波兰表达式求值
给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
了解完概念之后,百科上讲的很清楚:实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中缀表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。
通过这句话就能明白该题需要用栈的思想来解决问题;翻译之后就是遇到数字入栈,遇到操作符(+、-、*、/)出栈两个数并计算,将计算的结果再入栈,栈中最后一个值即是结果;
具体代码实现如下:
var evalRPN = function(tokens) {
let stack = [];
for(let item of tokens){
if(isNaN(Number(item))){
let num1 = Number(stack.pop()) || 0; // 第一个出栈的是减数或者除数
let num2 = Number(stack.pop()) || 0; // 第二个出栈的是被减数或者被除数
let res = 0;
switch(item){
case '+': res = num1 + num2;
break;
case '-': res = num2 - num1;// 第一个出栈的是减数,第二个出栈的是被减数
break;
case '*': res = num1 * num2;
break;
case '/': res = parseInt(num2 / num1); // 第一个出栈的是除数,第二个出栈的是被除数
break;
}
stack.push(res)
} else {
stack.push(item)
}
}
return stack.pop()
};
好了今天的分享就到这里;