代码随想录算法训练营Day11 | 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
LeetCode 20. 有效的括号
题目链接:LeetCode 20. 有效的括号
思路:
1.长度为奇数,剪枝
2. 如果是左括号,push右括号
3. 如果是右括号,比较是否相等,不相等则为false
class Solution {
public:
bool isValid(string s) {
if (s.size()%2) return false;
stack<char> st;
for (char symbol:s){
if(symbol == '(') st.push(')');
else if (symbol == '{') st.push('}');
else if (symbol == '[') st.push(']');
else if (st.empty() || st.top() != symbol){
return false;
}
else{
st.pop();
}
}
return st.empty();
}
};
注意 :
- 注意 单引号’为char 双引号"为string
1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项
思路:
1.用字符表示stack;
2.字符串的back即为stack的top
3.push
class Solution {
public:
string removeDuplicates(string s) {
string st;
for (char symbol:s){
if(st.empty() || symbol != st.back()){
st.push_back(symbol);
}
else{
st.pop_back();
}
}
return st;
}
};
注意 :
- 字符串也可以push_back和pop_back;
LeetCode 150. 逆波兰表达式求值
思路:
1.分别判断加减乘除
分别提取stack里的数 用long long
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for (string s:tokens){
if (s=="+"||s=="-"||s=="*"||s=="/"){
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
if (s=="+") st.push(num2 + num1);
else if (s=="-") st.push(num2 - num1);
else if (s=="*") st.push(num2 * num1);
else if (s=="/") st.push(num2 / num1);
}
else{
st.push(stoll(s));
}
}
int result = st.top();
st.pop();
return result;
}
};
注意 :
- 注意else st.push(stoll(s));的位置