20.有效的括号
栈类的题目都很神奇,这道题分有不有效有三种情况,一种是左括号多了,一种是右括号多了,一种是左括号和右括号不匹配。我们设置一个栈来放s[i]所对应的右括号,如果s[i]==‘{’,那么就在栈里放‘}’,依次类推.......假如遇到的是一个右括号,那么就看看它和栈顶元素是否匹配(因为栈顶元素对应的是最近的一个左括号),如果不匹配就返回false,对应的是左括号和右括号不匹配的情况。假如说还没把s遍历完,栈就为空了,说明这时候右括号多了,也返回false,最后怎么判断左括号多了的情况呢?就看遍历完后栈是否为空,不为空说明左括号多了,不匹配。
https://leetcode.cn/problems/valid-parentheses/
class Solution {
public:bool isValid(string s) {stack<char>right;for(int i=0;i<s.size();i++){if(s[i]=='{'){right.push('}');}else if(s[i]=='('){right.push(')');}else if (s[i]=='['){right.push(']');}else if(right.empty()||right.top()!=s[i])return false;elseright.pop();}return right.empty();}
};
1047.删除字符串中的所有相邻重复项
这道题和上一道题的内核有点像,本质上都是消消乐,即遇到匹配的元素就两个一起销毁。所以一开始的思路是先设置一个栈,然后遍历给定的字符串s,如果s[i]==栈顶元素,说明可以消消乐了,所以stack.pop(),然后我们再把栈里面的元素取出来,但由于是先进后出,所以结果还得reverse。不过,我们也可以用字符串来模拟栈,这样就不用reverse,相当换了一个方向,我们还是遍历字符串,如果s[i]和result的最后一个元素相同,那么就消消乐,result.pop_back(),注意,这里的前提条件是栈即字符串result不能为空;如果元素不同,那么result.push_back(s[i])。
https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/、
class Solution {
public:string removeDuplicates(string s) {string result;for(int i=0;i<s.size();i++){ if(!result.empty()&&s[i]==result.back()){result.pop_back();}else{result.push_back(s[i]);}} return result;}
};
150.逆波兰表达式求值
这道题还是采用消消乐的方法,一旦遇到符号就把栈顶元素和栈顶元素的下一个元素进行运算,然后又返回栈里。这道题看似简单,实际上有几个小细节需要注意:虽然tokens[i]对应的都只是一个字符,但是它还是字符串,所以判断的时候要写tokens[i] == "+"而不能写tokens[i] == ‘+’,注意单引号和双引号的区别,同时,我们把元素入栈的时候,由于是把字符串入栈,所以要先把字符串转换为int类型再放入栈中,所以要用stoi函数, st.push(std::stoi(tokens[i]));最后,我们要得到结果,这时候需要取出栈里面的结果,就要用到stack.top()。
https://leetcode.cn/problems/evaluate-reverse-polish-notation/
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();int temp;if(tokens[i]=="+"){temp=num2+num1;}else if(tokens[i]=="-"){temp=num2-num1;}else if(tokens[i]=="*"){temp=num2*num1;}else if(tokens[i]=="/"){temp=num2/num1;}st.push(temp);}else{st.push(std::stoi(tokens[i]));}}int result=st.top();st.pop();return result;}
};