class Solution {
public:
bool isValid(string s) {
stack<char> _stack;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') _stack.push(')');
else if (s[i] == '{') _stack.push('}');
else if (s[i] == '[') _stack.push(']');
else if (_stack.size() == 0 || s[i] != _stack.top()) {
return false;
}else {
_stack.pop();
}
}
return _stack.size() == 0 ? true : false;
}
};
- 1047.删除字符串中的所有相邻重复项
- 空字符串不要用s[]访问,会发生越界,熟练使用string重载的‘+’运算
class Solution {
public:
string removeDuplicates(string s) {
stack<char> _stack;
for (int i = 0; i < s.size(); i++) {
if (!_stack.empty() && s[i] == _stack.top()) _stack.pop();
else _stack.push(s[i]);
}
string res;
int _stack_size = _stack.size();
while (_stack.size()) {
res = _stack.top() + res;
_stack.pop();
}
return res;
}
};
- 150.逆波兰表达式求值
- 还要注意:使用栈计算逆波兰表达式值时,先弹出的元素为第二操作数,从模拟过程来看这也很显然
- 随想录说要开longlong,而我用int也ac了
- 主要还是卡在了字符串转换成数字这里
- 拓展:
- char型数组可以转为string:使用string构造函数:string str(数组名)
- vectorvec,可以转为string:string str(vec.begin(), vec.end()
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> _stack;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] == "+" || tokens[i] == "-" ||tokens[i] == "*" ||tokens[i] == "/") {
int num1 = _stack.top();
_stack.pop();
int num2 = _stack.top();
_stack.pop();
int res = num2 ;
if (tokens[i] == "+") _stack.push(num2 + num1);
if (tokens[i] == "-") _stack.push(num2 - num1);
if (tokens[i] == "*") _stack.push(num2 * num1);
if (tokens[i] == "/") _stack.push(num2 / num1);
}else {
_stack.push(stoi(tokens[i]));
}
}
return _stack.top();
}
};