20.有效的括号
文章链接:代码随想录 (programmercarl.com)
思路:括号匹配是用栈解决的经典问题
该题有三种不匹配情况:
①字符串左方向的括号不匹配 多出来左括号
②括号不多不少,只是括号不对应
③字符串右方向的括号不匹配,多出来右括号
对应的解决办法:
①将队列里面左方向的括号对应的右括号放入栈中,然后遍历队列的字符串,当左字符串遍历结束,发现栈不为空,说明多了左字符串
②把左方向的括号对应的右括号放入栈中,然后与原字符串比较,不匹配的话,不符合题目要求
③与①相反,字符串还没遍历结束,栈为空——右括号多了
class Solution {
public:
bool isValid(string s) {
stack<char> 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()||st.top()!=s[i])
{
return false;
}
else
{
st.pop();
}
}
return st.empty();
}
};
1047,删除字符串中的所有相邻重复项
思路:栈里面存放遍历过的元素,将元素与栈里面的元素作比较,如果两者不相等,把元素放入到栈里面,相等的话,把元素从栈里面弹出来
代码参考代码随想录
class Solution {
public:
string removeDuplicates(string s) {
string result;
for(char s : s) {
if(result.empty() || result.back() != s) {
result.push_back(s);
}
else {
result.pop_back();
}
}
return result;
}
};
150.逆波兰表达式求值
思路:
将数字放入栈中,遇到操作符,从栈中取出数字做相应的运算,再将结果放入栈中。
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;
}
};