20. 有效的括号
解决好三种不匹配的情况:
字符串未遍历完,而栈已经空
字符串遍历完,栈还有
当前字符与栈顶不匹配
本题巧妙解法在于,读到左括号时,存右括号
class Solution {
public:
bool isValid(string s) {
stack<int> st;
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()||s[i]!=st.top()) return false;
else{
st.pop();
}
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
easy
记得把栈里的字符取出来,而且要翻转一下
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(int i = 0;i<s.size();i++){
if(!st.empty()&&s[i]==st.top()){ // 记得考虑栈空了的情况
st.pop();
}
else{
st.push(s[i]);
}
}
string res = "";
while(!st.empty()){
res+=st.top();
st.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
150. 逆波兰表达式求值

两类数据:运算符和数字,运算符分四种。
所以先判断是数字还是运算符,如果是运算符,就存下栈顶的两个数,再判断是哪种运算符进行运算。
注意除法和减法是谁减谁
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for(int i = 0;i<tokens.size();i++){
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
int num1 = st.top();
st.pop();
int num2 = st.top();
st.pop();
if(tokens[i]=="+") st.push(num1+num2);
if(tokens[i]=="-") st.push(num2-num1);
if(tokens[i]=="*") st.push(num1*num2);
if(tokens[i]=="/") st.push(num2/num1); // 注意除法和减法,谁除谁,谁减谁
}
else{ // 数字
st.push(stol(tokens[i]));
cout <<st.top()<<" ";
}
}
int res = st.top();
return res;
}
};