相关链接
视频讲解:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
视频讲解:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili
视频讲解:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili
有效的括号
解题思路
共有三种不匹配的状况:
1)左括号多了
2)符号类型不匹配
3)右括号多了
遍历字符串,当遇到左类型的括号,就将相应的右括号类型压入栈中。
解决第二种情况,就是将栈顶元素与遍历遇到右括号进行匹配,不相等就返回false。
解决第三种情况,就是栈中所有元素都空了但是字符串并未遍历全部,则返回false。
(在代码中应先注意判空!)
最后考虑第一种情况 ,当遍历到右括号类型的符号并不是2、3种情况,则对栈中元素弹出,若栈为空则为true,若栈不为空则为false。
AC代码
class Solution {
public:
bool isValid(string s) {
if(s.size()%2!=0)
return false;
stack<char>sc;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
sc.push(')');
else if(s[i]=='[')
sc.push(']');
else if(s[i]=='{')
sc.push('}');
else if(sc.empty()||s[i]!=sc.top())
return false;
else sc.pop();
}
return sc.empty();
}
};
删除字符串中的所有相邻重复项
解题思路
用字符串模拟栈,字符串的尾部作为栈的出口。遍历题目所给的字符串,若此时字符串模拟的栈为空或者此时的元素与栈顶元素不同则将元素压入字符串的末尾,否则遇到相同的元素弹出,最后返回的字符串既符合提议要求。
AC代码
class Solution {
public:
string removeDuplicates(string s) {
string result;
for(char a:s)
{
if(result.empty()||a!=result.back())
result.push_back(a);
else
result.pop_back();
}
return result;
}
};
逆波兰表达式求值
解题思路
遇到符号则对栈中的两个元素进行相关操作再放入栈中,如此往复。
AC代码
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(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]));
}
int result=st.top();
st.pop();
return result;
}
};
总结
对栈的一些操作有了认识,但还是不够熟练掌握和理解,其次字符串模拟栈这个用法第一次接触到,这个方法确实很厉害!
stoll()将在函数调用中作为参数提供的字符串转换为long long int。它解析str并将其内容解释为指定基数的整数,并将其作为long long int类型的值返回。