栈在一些匹配问题上有着超棒的效果。
其核心思想就是判断栈顶元素和待加入元素是否匹配。
class Solution {
public:
bool isValid(string s) {
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() && st.top() != s[i]) return false;
else{
st.pop();
}
}
return st.empty();
}
};
需要注意的是st.top()前一定为判空。
当需要返回值的时候,可以用vector来模拟栈。
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
vector<int>st;
for(int i = 0; i < asteroids.size(); i++){
bool alive = true;
while(alive&& asteroids[i] < 0 && st.back() > 0 ){
alive = -asteroids[i] > st.back();
if(st.back() <= - asteroids[i])
st.pop_back();
}
if(alive){
st.push_back(asteroids[i]);
}
}
return st;
}
};
加入一个alive来判断行星有没有毁灭。
因为行星不是不碰撞一个,所以用while.
while()表示有碰撞的可能,那么alive必须要更新,来判断有没有要毁灭。
如果没有毁灭了,则加入。