题目一:20. 有效的括号
初见:用了三个变量分别代表不同的括号,但该做法不能处理左右括号不匹配的情况,且仅仅简单使用栈
思路:
1. 通过让左括号入栈,然后比较右括号,在一次遍历解决了问题
代码:
需要注意的点就是,for循环后的return 需要 判断 stack是否为空。可能会出现仅左括号入栈的情况
class Solution {
public:
bool isValid(string s) {
//为奇数肯定错误
if(s.size() % 2 != 0) return false;
stack<char> st;
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() ||s[i] != st.top()) return false;
else if(s[i] == st.top()) st.pop();
}
//判断左括号是否多了
return st.empty();
}
};
题目二:1047. 删除字符串中的所有相邻重复项
初见:过了,记录第一次思路正确
思路:
1. 根据当前字符跟栈里的字符比较,若相等则出栈,不相等则入栈
2. 将栈里的内容从后面开始存入新的字符串result
代码一:
用栈的解法
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(int i = 0; i < s.size(); i++)
{
//当栈为空或者元素不对应时,先存放元素
if(st.size() == 0 || st.top( ) != s[i]) st.push(s[i]);
else st.pop();
}
string result(st.size(),' ');
//从字符串后面存放元素
for(int i = st.size() - 1; i >= 0; i--)
{
result[i] = st.top();
st.pop();
}
return result;
}
};
代码二:
不使用栈,靠字符串的语法解决
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. 逆波兰表达式求值
初见:直接看的视频,看不懂题目的意思
思路:
1. 如果遇到操作符,就从栈上取两个元素进行计算
代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long int> st;
for(int i = 0; i < tokens.size(); i++)
{
//如果遇到操作符,就从栈上取两个元素进行计算
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
long int n1 = st.top();
st.pop();
long int n2 = st.top();
st.pop();
if(tokens[i] == "+") n2 += n1;
else if(tokens[i] == "-") n2 -= n1;
else if(tokens[i] == "*") n2 *= n1;
else n2 /= n1;
st.push(n2);
}
//进行转换成栈类型的数据
else st.push(stoll(tokens[i]));
}
long int i = st.top();
st.pop();
return i;
}
};