LeetCode 20.有效的括号
class Solution {
public:
bool isValid(string s) {
if(s.size()%2)return false;
stack<char> 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();
}
};
这题思路真的听巧妙的,我自己想不到。
LeetCode 1047. 删除字符串中的所有相邻重复项
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.push(s[i]);
}
else{
st.pop();
}
}
string res;
while(!st.empty()){
res+=st.top();
st.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
卡哥用的迭代器方法也可以。
LeetCode 150. 逆波兰表达式求值
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for(int i=0;i<tokens.size();i++){
if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*" || tokens[i]=="/"){
long long num1=st.top();
st.pop();
long long num2=st.top();
st.pop();
if(tokens[i]=="+")st.push(num1+num2);
else if(tokens[i]=="-")st.push(num2-num1);
else if(tokens[i]=="*")st.push(num1*num2);
else st.push(num2/num1);
}
else st.push(stoll(tokens[i]));
}
return st.top();
}
};
这里判断时要用token[i]==“”,双引号,因为传进来的tokens数组每一个元素都是string类型。