20. 有效的括号
class Solution {
public:
bool isValid(string s) {
if(s.size()%2!=0)return false;//字符串长度为奇数,不符合要求
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(']');
//两种失败情况:遇到右括号,和栈顶元素比较不相等or右括号多了
else if(st.empty()||st.top()!=s[i])return false;
else st.pop();//匹配弹出
}
return st.empty();//第三种失败情况:左括号多了
}
};
1047. 删除字符串中的所有相邻重复项
class Solution {
public:
string removeDuplicates(string s) {
stack<char>st;
for(int i=0;i<s.size();i++){
//栈为空或不可消去,压栈
if(st.empty()||st.top()!=s[i])
st.push(s[i]);
else
st.pop();//可消,出栈
}
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;
int num1,num2,res;
for(int i=0;i<tokens.size();i++){
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
num1=st.top();st.pop();
num2=st.top();st.pop();
if(tokens[i]=="+")st.push(num2+num1);
if(tokens[i]=="-")st.push(num2-num1);
if(tokens[i]=="*")st.push(num2*num1);
if(tokens[i]=="/")st.push(num2/num1);
}else{
st.push(stoll(tokens[i]));
}
}
res=st.top();
st.pop();
return res;
}
};