Day11——栈和队列II
● 20.有效的括号
● 1047.删除字符串中的所有相邻重复项
● 150.逆波兰表达式求值
20.有效的括号
思路:没有想到用栈,刚开始以为“({)}”这种也行,直接一次循环,后来发现不行,那就只能重新想办法,看题解用栈
bool isValid(string s) {
int len = s.size();
if(len % 2 != 0) return false;
stack<int> st;
for(char c : s) {
if(c == '(') st.push(')');
else if (c == '[') st.push(']');
else if (c == '{') st.push('}');
else if (!st.empty() && st.top() == c) st.pop();
else return false;
}
return st.empty();
}
1047.删除字符串中的所有相邻重复项
思路:有了上一题的经验,还是明白应该用栈的,当前元素和栈顶相同出栈,不同直接入栈。最后返回栈。
string removeDuplicates(string s) {
stack<char> st;
for(char c : s) {
if (!st.empty() && c == st.top())
st.pop();
else st.push(c);
}
string res = "";
while(!st.empty()) {
res += st.top();
st.pop();
}
reverse(res.begin(), res.end());
return res;
}
时间复杂度: O(n)
空间复杂度: O(n)
方法二:栈也是只用最后一位,但需要反转整个字符串。用字符串替换栈也可以做到。
string removeDuplicates(string s) {
string res = "";
for(char c : s) {
if (!res.empty() && c == res.back())
res.pop_back();
else res.push_back(c);
}
return res;
}
时间复杂度: O(n)
空间复杂度: O(1),返回值不计空间复杂度
150.逆波兰表达式求值
思路:逆波兰式是后缀表达式,使用栈保存数字,遇到操作符弹出栈顶两个元素,运算后再入栈。
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for(string s : tokens) {
if(s == "+" || s == "-" ||
s == "*" || s == "/") {
long long num2 = st.top();
st.pop();
long long num1 = st.top();
st.pop();
long long num = 0;
if(s[0] == '+') num = num1 + num2;
if(s[0] == '-') num = num1 - num2;
if(s[0] == '*') num = num1 * num2;
if(s[0] == '/') num = num1 / num2;
st.push(num);
} else
st.push(stoi(s));
}
return st.top();
}