代码随想录刷题——栈和队列篇(三)
20.有效的括号
1047.删除字符串中的所有相邻重复项
20.类似模拟:
class Solution { public:bool isValid(string s) {stack<char> st;for(int i=0;i<s.size();i++){//左括号直接入栈if(s[i]=='('||s[i]=='{'||s[i]=='['){st.push(s[i]);}else{if(!st.empty()){//判断括号是否匹配if(s[i]==')'&&st.top()=='('){st.pop();continue;} if(s[i]=='}'&&st.top()=='{'){st.pop();continue;}if(s[i]==']'&&st.top()=='['){st.pop();continue;}}st.push(s[i]);}}if(!st.empty()) return false;return true;} };
1047.和括号没啥区别:
class Solution{ public:string removeDuplicates(string s) {stack<char> st;string ans;for(int i=0;i<s.length();i++){//栈空压栈,栈顶与字符相等弹出,不相等继续压栈if(st.empty()){st.push(s[i]);}else if(st.top()==s[i]){st.pop();}else{st.push(s[i]);}}if(st.empty()) return "";//最终栈非空就逐元素弹栈,再反转一下while(!st.empty()){ans+=st.top();st.pop();}reverse(ans.begin(),ans.end());return ans;} };
其他:
(1)栈最最最经典的题目,就是先后顺序+匹配两步,刚好完美契合栈后进先出+返回栈顶值的特点
(2)string类型用size()和length()来获取长度都可以,没有什么区别
(3)reverse()用迭代器s.begin()和s.end()这种