20. 有效的括号(简单)
leetcode题目链接:20. 有效的括号 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili
题目描述:
解题思路:
1.遍历字符串,遇到左括号 '(' '{' '[' 就存入栈中。
2.遍历字符串,遇到右括号 ')' '}' ']' 就弹栈,如果栈顶元素不匹配,就return false。
3.如果栈不空就return false,空就return true。
注意事项:
需要用栈空这个条件来判断存在单左括号但没有右括号的情况。
题目代码:
class Solution {
public:
bool isValid(string s)
{
for (const auto r : s)
{
if (r == '(' || r == '[' || r == '{')
{
cst.push(r);
count++;
}
if (r == ')')
{
if (!cst.empty() && cst.top() == '(')
{
cst.pop();
continue;
}
else
return false;
}
if (r == ']')
{
if (!cst.empty() && cst.top() == '[')
{
cst.pop();
continue;
}
else
return false;
}
if (r == '}')
{
if (!cst.empty() && cst.top() == '{')
{
cst.pop();
continue;
}
else
return false;
}
}
return cst.empty();
}
private:
stack<char> cst;
};
总结:
栈的经典应用。
1047. 删除字符串中的所有相邻重复项(简单)
leetcode题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili
题目描述:
解题思路:
方法一:栈
方法二:直接用字符串模拟栈,省下了弹栈获得字符串的时间。
题目代码:
法一:栈
class Solution {
public:
string removeDuplicates(string s) {
string result;
for (const auto& r : s)
{
if (!cstack.empty() && r == cstack.top())
cstack.pop();
else cstack.push(r);
}
while (!cstack.empty())
{
result += cstack.top();
cstack.pop();
}
reverse(result.begin(),result.end());
return result;
}
private:
stack<char> cstack;
};
法二:字符串模拟栈
class Solution {
public:
string removeDuplicates(string s) {
string result;
for (const auto& r : s)
{
if (!result.empty() && r == result.back())
result.pop_back();
else
result += r;
}
return result;
}
};
总结:
栈的经典应用,消消乐游戏的原理。
150. 逆波兰表达式求值(中等)
leetcode题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
文章讲解:代码随想录 (programmercarl.com)
视频讲解:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili
题目描述:
解题思路:
1.碰到数字就压入栈中。
2.碰到符号就取栈顶两个元素运算并压入栈。
3.最后栈顶元素就是答案
注意事项:
题目给的数字是string,要转换成long long。
题目代码:
class Solution {
public:
int evalRPN(vector<string>& tokens)
{
long long num = 0;
for (const auto& r : tokens)
{
if (r != "+" && r != "-" && r != "*" && r != "/")
lst.push(atoi(r.c_str()));
if (r == "+")
{
num = lst.top();
lst.pop();
num += lst.top();
lst.pop();
lst.push(num);
}
if (r == "-")
{
num = lst.top();
lst.pop();
num = lst.top() - num;
lst.pop();
lst.push(num);
}
if (r == "*")
{
num = lst.top();
lst.pop();
num *= lst.top();
lst.pop();
lst.push(num);
}
if (r == "/")
{
num = lst.top();
lst.pop();
num = lst.top() / num;
lst.pop();
lst.push(num);
}
}
num = lst.top();
return num;
}
private:
stack<long long> lst;
};
总结:
要充分利用栈先进后出的性质。