有效的括号
- 括号匹配,用栈
- 遍历字符串,如果是左括号就把右括号放进栈中,不是的话就要弹出栈看是否匹配
- 写代码之前要想好不匹配的情况:3种。左括号多,右括号多,左右括号个数一样但匹配不上
class Solution {
public:
bool isValid(string s) {
stack<char> st;
if(s.size()%2!=0) return false;
for(int i=0;i<s.size();i++){
if(s[i]=='(') st.push(')');
else if(s[i]=='[') st.push(']');
else if(s[i]=='{') st.push('}');
else if(st.empty()||st.top()!=s[i]) return false;
else st.pop();
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
- 遍历字符串的时候需要去比较之前遍历过的,用栈来存之前遍历过的字符
class Solution {
public:
string removeDuplicates(string s) {
string res;
for(char c:s){
if(res.empty()||c!=res.back())
res.push_back(c);
else res.pop_back();
}
return res;
}
};
150. 逆波兰表达式求值
- 类似上一题,只不过是相邻字符做运算,再把结果放进栈里
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(auto c:tokens){
cout<<c<<endl;
if(c=="+"||c=="-"||c=="*"||c=="/"){
int num1=st.top();
st.pop();
int num2=st.top();
st.pop();
if(c=="+") st.push(num1+num2);
if(c=="-") st.push(num2-num1);
if(c=="*") st.push(num1*num2);
if(c=="/") st.push(num2/num1);
cout<<st.top()<<" 4 "<<endl;
}
else st.push(stoi(c));
}
return st.top();
}
};