20. 有效的括号
题目链接: 20. 有效的括号
思路: 本题就是简单的利用栈进行匹配即可,遇到左括号就全部入栈,遇到右括号就从栈中弹出一个括号看两者是否匹配。其中的坑是当只有一个括号直接return false,当遇到右括号的同时栈中为空直接return false。
代码如下:
class Solution {
public:
bool isValid(string s) {
stack<char> a;
if(s.size() == 1) return false;//特殊情况
for(int i = 0; i < s.size(); i++){
char temp;
if(s[i] == '(' || s[i] == '{' || s[i] == '[') a.push(s[i]);//左括号们,进栈
if(s[i] == ')'){//匹配
if(!a.size()) return false;//此时要是栈空则不符合
else{//若是栈不空 弹出来看看是不是可以匹配的
temp = a.top();
a.pop();
if(temp != '(') return false;
}
}
if(s[i] == '}'){//同上
if(!a.size()) return false;
else{
temp = a.top();
a.pop();
if(temp != '{') return false;
}
}
if(s[i] == ']'){//同上
if(!a.size()) return false;
else{
temp = a.top();
a.pop();
if(temp != '[') return false;
}
}
}
if(a.size()) return false;
else return true;
}
};
1047. 删除字符串中的所有相邻重复项
题目链接: 1047. 删除字符串中的所有相邻重复项
思路: 若是相邻的两个元素不一样就压入栈中,要是当前正在遍历的元素和栈顶的元素相同,直接将栈顶元素弹出,循环到下一个即可。
代码如下:
class Solution {
public:
string removeDuplicates(string s) {
stack<char> stk;
for(int i = 0; i < s.size(); i++){
if(stk.size() && stk.top() == s[i]) stk.pop();
else stk.push(s[i]);
}
string res;
while(stk.size()){
res += stk.top();//小坑,如果用res = stk.top() + res 会爆超时(狗头)
stk.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
150. 逆波兰表达式求值
题目链接: 150. 逆波兰表达式求值
思路: 本题是后缀表达式,我们理解时可以把无论是前缀,后缀,中缀表达式,看成表达式树,如果建立起表达式树,我们只需简单的递归即可。本题我们则是利用栈来实现表达式树,当是符号时就从栈中弹出两个元素,计算后将其压入栈中,最后栈中剩下的就只有答案了。
class Solution {
public:
stack<int> stk;
void eval(string s){
int b = stk.top();
stk.pop();
int a = stk.top();
stk.pop();
if(s == "+") stk.push(a + b);
else if(s == "-") stk.push(a - b);
else if(s == "*") stk.push(a * b);
else stk.push(a / b);
}
int evalRPN(vector<string>& tokens) {
for(int i = 0; i < tokens.size(); i++){
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "/" || tokens[i] == "*") eval(tokens[i]);
else stk.push(stoi(tokens[i]));//这个是将字符转成数字的函数(很多小伙伴可能不知道【我一开始也不会(狗头)】)
}
return stk.top();
}
};//学到了