代码随想录算法训练营第十一天 | 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
1.1 20. 有效的括号
思路:
- 括号匹配是使用栈解决的经典问题
- 可以通过map进一步优化匹配过程
class Solution {
public:
bool isValid(string s) {
int size = s.size();
if (size % 2 != 0) return false;
unordered_map<char, char> dict = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<int> temp;
for(auto c : s){
if(dict.find(c) == dict.end()){
temp.push(c);
}
else{
if(!temp.empty() && dict[c] == temp.top() ){
temp.pop();
}
else return false;
}
}
return temp.empty();
}
};
1.2 1047. 删除字符串中的所有相邻重复项
思路:
- 可以用字符串直接做栈
class Solution {
public:
string removeDuplicates(string s) {
string res;
for(char c : s){
if(res.empty() || res.back() != c) res.push_back(c);
else res.pop_back();
}
return res;
}
};
补充:
- 实现函数递归调用就需要栈
- 栈溢出:
Segmentation fault
- 在企业项目开发中,尽量不要使用递归!容易造成栈溢出错误(这种问题还不好排查!)
1.3 150. 逆波兰表达式求值
思路:
- 逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面
- 其实逆波兰表达式相当于是二叉树中的后序遍历,可以把运算符作为中间节点,按照后序遍历的规则画出一个二叉树
- 就是一个相邻字符串消除的过程
- c_str()函数返回一个指向正规C字符串的指针,但是数据是临时的,可以通过strcpy等函数复制出来
- stoi的参数是const string类型,atoi的参数是const char类型
- 如果使用atoi对string进行转化,就需要c_str()函数将const string类型转化为cons char类型
class Solution {
bool isNumber(string& token) {
return !(token == "+" || token == "-" || token == "*" || token == "/");
}
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
for(string i : tokens){
if(isNumber(i)){
stk.push(stoi(i));
}
else{
int num2 = stk.top();
stk.pop();
int num1 = stk.top();
stk.pop();
switch (i[0]){
case '+':
stk.push(num1 + num2);
break;
case '-':
stk.push(num1 - num2);
break;
case '*':
stk.push(num1 * num2);
break;
case '/':
stk.push(num1 / num2);
break;
}
}
}
return stk.top();
}
};