20.有效的括号
整理好不匹配的情况有哪些种类,写代码就顺畅了。使用栈进行实现还是比较简单的。
不匹配的情况:
1、匹配错误
2、左括号多了——最后栈中还有元素剩余
3、右括号多了——需要匹配但栈是空的
// 将需要匹配的左括号存入栈
// 遇到右括号时将栈顶弹出并与右括号匹配
// 如果匹配失败或是最后栈中还有元素剩下说明字符串不是有效的
bool isValid(string s) {
// 可以进行剪枝:如果字符串长度是奇数,则一定有不匹配的括号
if (s.size() % 2 == 1)
return false;
stack<char> parentheses;
for (char c : s) {
if (c == '(')
parentheses.push(')');
else if (c == '{')
parentheses.push('}');
else if (c == '[')
parentheses.push(']');
if (c == ')') {
if (parentheses.empty() || parentheses.top() != c)
return false;
else
parentheses.pop();
}
else if (c == '}') {
if (parentheses.empty() || parentheses.top() != c)
return false;
else
parentheses.pop();
}
else if (c == ']') {
if (parentheses.empty() || parentheses.top() != c)
return false;
else
parentheses.pop();
}
}
// 处理多余左括号情况
return parentheses.empty();
}
1047.删除字符串中的所有相邻重复项
题目与栈的机制十分契合。
使用栈进行实现:
// 将字符串中的元素逐个存入栈
// 如果存入时发现字符与栈顶字符相同则不存入并将栈顶弹出
// 最后将栈元素逐个弹出组成结果字符
string removeDuplicates(string s) {
stack<char> st;
string ans;
for (char c : s) {
if (!st.empty() && st.top() == c)
st.pop();
else
st.push(c);
}
while (!st.empty()) {
ans = st.top() + ans;
st.pop();
}
return ans;
}
使用字符串结构模拟栈进行实现,字符串尾模拟栈顶
string removeDuplicates(string s) {
string ans = "";
for (char c : s) {
if (!ans.empty() && ans.back() == c)
ans.pop_back();
else
ans.push_back(c);
}
return ans;
}
150.逆波兰表达式求值
理解了逆波兰表达式的规则,按规则写就行,比较简单。
忘记了有stoi库函数,还多写了一步将字符串转换为整型字符的函数
// 字符串转换为整型数字
int stringToInt(string s) {
int k = 1;
int res = 0;
for (int i = s.size() - 1; i >= 0; --i) {
if (s[i] == '-')
return -res;
res += (s[i] - '0') * k;
k *= 10;
}
return res;
}
// 按规则写就行,注意细节
int evalRPN(vector<string>& tokens) {
stack<int> st;
int temp;
for (string s : tokens) {
if (s == "+") {
temp = st.top();
st.pop();
st.top() += temp;
}
else if (s == "-") {
temp = -st.top();
st.pop();
st.top() += temp;
}
else if (s == "*") {
temp = st.top();
st.pop();
st.top() *= temp;
}
else if (s == "/") {
temp = st.top();
st.pop();
st.top() /= temp;
}
else {
// 使用库函数stoi即可
// st.push(stoi(s));
st.push(stringToInt(s));
}
}
return st.top();
}
这些题知道使用栈来实现都不难,但是看到题目如何反应过来要使用栈来做呢?