Day 11 栈与队列
20. 有效的括号
被坑了两次。一次是只有左括号,一次是只有右括号。太着急了。面试的时候没处理好边界也是会被扣分的。
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (auto c : s)
{
switch (c)
{
case '(':
case '[':
case '{':
stk.push(s[i]);
break;
case ')':
if (!stk.empty() && stk.top() == '(')
stk.pop();
else
return false;
break;
case ']':
if (!stk.empty() && stk.top() == '[')
stk.pop();
else
return false;
break;
case '}':
if (!stk.empty() && stk.top() == '{')
stk.pop();
else
return false;
break;
}
}
return stk.empty();
}
};
1047.删除字符串中的所有相邻重复项
直接使用string来模拟栈操作,代码更简洁。
class Solution {
public:
string removeDuplicates(string s) {
string ret;
ret.reserve(s.size());
for (auto c : s)
{
if (ret.size() && ret.back() == c)
{
ret.pop_back();
}
else
{
ret.push_back(c);
}
}
// ret.shrink_to_fit();
return ret;
}
};
150. 逆波兰表达式求值
本来是打算这样写:
for (auto &token : tokens)
{
...
switch (token[0])
{
case '+':
break;
case '-':
val2 = stk.top();
stk.pop();
val1 = stk.top();
stk.pop();
...
break;
...
}
}
但是有问题,别忘了数字的范围是[-200, 200]
,也就是说,如果是负数的话,它的第一位也是减号,会进入处理减号的case,不合理。
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
for (auto &token : tokens)
{
int val1, val2, rst;
if(token == "+" || token == "-" || token == "*" || token == "/")
{
val2 = stk.top();
stk.pop();
val1 = stk.top();
stk.pop();
switch (token[0])
{
case '+':
rst = val1 + val2;
break;
case '-':
rst = val1 - val2;
break;
case '*':
rst = val1 * val2;
break;
case '/':
rst = val1 / val2;
break;
}
stk.push(rst);
}
else
{
stk.push(stoi(token));
}
}
return stk.top();
}
};