代码随想录算法训练营第十天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
20. 有效的括号
特点:
左括号之后,可能还会有左括号,但是只要有右括号,那么它必须立刻和最近的左括号
代码:
1 char returnRightChar(char &c) 2 { 3 switch (c) 4 { 5 case '[': return ']'; 6 case '(': return ')'; 7 case '{': return '}'; 8 } 9 10 return NULL; 11 } 12 bool isValid(string s) 13 { 14 stack<char> left; 15 16 for (char c : s) 17 { 18 if (c == '[' || c == '(' || c == '{') 19 { 20 left.push(c); 21 } 22 else 23 { 24 if (!left.empty()&&c == returnRightChar(left.top())) 25 { 26 left.pop(); 27 } 28 else { 29 return false; 30 } 31 32 } 33 34 } 35 36 return left.empty(); 37 }
1047. 删除字符串中的所有相邻重复项
因为较为简单,直接贴代码:
代码:
1 string removeDuplicates(string s) { 2 stack<char> charStack; 3 4 for (int i = 0; i < s.size(); i++) 5 { 6 if (!charStack.empty() && charStack.top() == s[i]) 7 { 8 charStack.pop(); 9 continue; 10 } 11 12 charStack.push(s[i]); 13 } 14 15 string result; 16 while (!charStack.empty()) 17 { 18 result += charStack.top(); 19 charStack.pop(); 20 } 21 22 int i = 0; 23 int j = result.size() - 1; 24 while (i < j) 25 { 26 auto mid = result[i]; 27 result[i] = result[j]; 28 result[j] = mid; 29 30 i++; 31 j--; 32 } 33 34 35 return result; 36 }
150. 逆波兰表达式求值
较为简单,主要是要注意 / - 的顺序
代码
1 int evalRPN(vector<string>& tokens) { 2 stack<int> resultStack; 3 4 for (auto token : tokens) 5 { 6 if (token != "+" && token != "-" && token != "*" && token != "/") 7 { 8 resultStack.push(stoi(token)); 9 } 10 else 11 { 12 int first = resultStack.top(); 13 resultStack.pop(); 14 int second = resultStack.top(); 15 resultStack.pop(); 16 17 if (token == "+") 18 { 19 resultStack.push(first + second); 20 } 21 else if (token == "-") 22 { 23 resultStack.push(second - first); 24 } 25 else if (token == "*") 26 { 27 resultStack.push(first * second); 28 } 29 else if (token == "/") 30 { 31 resultStack.push(second / first); 32 } 33 34 } 35 } 36 37 38 return resultStack.top(); 39 }