今天的題主要是關於棧的,比較簡單,一次性過
20. 有效的括號
講完了棧實現佇列,佇列實現棧,接下來就是棧的經典應用了。
大家先自己思考一下 有哪些不匹配的場景,在看影片 我講的都有哪些場景,落實到程式碼其實就容易很多了。
題目連結/文章講解/影片講解:https://programmercarl.com/0020.有效的括號.html
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const stack = [];
const common = {
')':'(',
'}':'{',
']':'[',
}
const common2 = ['(','{','[']
for(let i=0;i<s.length;i++){
if (common2.includes(s[i])) {
stack.push(s[i]);
continue;
}
let last = stack.pop();
if (last!==common[s[i]]) {
return false;
}
}
return stack.length>0?false:true;
};
- 刪除字串中的所有相鄰重複項
棧的經典應用。
要知道棧為什麼適合做這種類似於愛消除的操作,因為棧幫助我們記錄了 遍歷陣列當前元素時候,前一個元素是什麼。
題目連結/文章講解/影片講解:https://programmercarl.com/1047.刪除字串中的所有相鄰重複項.html
/**
* @param {string} s
* @return {string}
*/
var removeDuplicates = function(s) {
const stack = [s[0]];
for (let i=1;i<s.length;i++) {
if(stack[stack.length-1]===s[i]){
stack.pop();
}else{
stack.push(s[i])
}
}
return stack.join('');
};
- 逆波蘭表示式求值
本題不難,但第一次做的話,會很難想到,所以先看影片,瞭解思路再去做題
題目連結/文章講解/影片講解:https://programmercarl.com/0150.逆波蘭表示式求值.html
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
const stack = [];
for(let i=0;i<tokens.length;i++){
let c = tokens[i];
if (isNaN(Number(c))) {
let fast = stack.pop();
let two = stack.pop();
switch(c){
case '+':
stack.push(fast+two);
break;
case '-':
stack.push(two-fast);
break;
case '*':
stack.push(two*fast);
break;
case '/':
stack.push(two/fast>0?Math.floor(two/fast):Math.ceil(two/fast));
break;
}
console.log(stack)
}else{
stack.push(Number(c));
}
}
return stack[0];
};