20. 有效的括号
文章链接:代码随想录 (programmercarl.com)
视频链接:栈的拿手好戏!| LeetCode:20. 有效的括号
对称匹配的问题都可考虑用栈来解决,这道题也不例外。
栈解决的主要思想就是,遍历时,如果遇到'('、'['、'{'则分别将')'、']'、'{'入栈,遇到')'、']'、'{',就j进行出栈操作。
字符无效有三种情况,分别是左括号多了(遍历后栈里不为空),括号类型不匹配,遍历未结束但栈中已经为空,而遍历依旧要出栈操作。
代码如下:
class Solution {
public:
bool isValid(string s) {
stack<int> st;
if(s.size()%2!=0)//小小剪枝,奇数一定不符合
{
return false;
}
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()==true||s[i]!=st.top()) return false;
else st.pop();
}
if(st.empty()==false)
{
return false;
}
return true;
}
};
1047. 删除字符串中的所有相邻重复项
题目链接:Loading Question... - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项
这道题也是栈的经典题型,通过遍历,元素与top相同则pop,不相同则push。
需要注意的是,如果按照从前往后的顺序遍历,最后遍历产生的栈,再依次出栈产生的字符串是反转的。有两种解决方法,第一种:是遍历时就从后往前遍历, for(int i=s.size()-1;i>=0;i--),第二种:就是最后结果通过字符串反转,如下:
reverse (result.begin(), result.end())
总代码如下:
class Solution {
public:
string removeDuplicates(string S) {
stack<char> st;
for (char s : S) {
if (st.empty() || s != st.top()) {
st.push(s);
} else {
st.pop(); // s 与 st.top()相等的情况
}
}
string result = "";
while (!st.empty()) { // 将栈中元素放到result字符串汇总
result += st.top();
st.pop();
}
reverse (result.begin(), result.end()); //库函数反转
return result;
}
};
150. 逆波兰表达式求值
题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
文章链接:代码随想录 (programmercarl.com)
视频链接:栈的最后表演! | LeetCode:150. 逆波兰表达式求值
这道题已给出提示,遇到数字则入栈,遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中,那思路其实就很明确了,通过for循环遍历,if条件语句判定,进一步操作,代码如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for(int i=0;i<tokens.size();i++)
{
if(tokens[i]=="+")
{
long long m,n;
m=st.top();
st.pop();
n=st.top();
st.pop();
st.push(m+n);
}
else if(tokens[i]=="-")
{
long long m,n;
m=st.top();
st.pop();
n=st.top();
st.pop();
st.push(n-m);//注意!先出栈的是减数,后出栈的是被减数!
}
else if(tokens[i]=="/")
{
long long m,n;
m=st.top();
st.pop();
n=st.top();
st.pop();
st.push(n/m);//注意@先出栈的是除数,后出栈的是被除数!
}
else if(tokens[i]=="*")
{
long long m,n;
m=st.top();
st.pop();
n=st.top();
st.pop();
st.push(m*n);
}
else{
st.push(stoll(tokens[i]));//将字符串转化为long long型变量
}
}
return st.top();
}
};
Day11 打卡成功,耗时1.5小时,较为轻松,再接再厉!!!!