AB3 有效括号序列
关键思路:辅助栈,匹配则消掉;代码中详细解释
class Solution {
public:
/**
*
* @param s string字符串
* @return bool布尔型
*/
bool isValid(string s) {
// write code here
// 辅助栈
stack<char> stk; // 用来存储“左” ( { [
int lenS = s.size(); // 求出字符串的长度
for (int i = 0; i < lenS; ++i) {
switch(s[i]) {
case '(':
case '{':
case '[':
// 是( [ { 就push进辅助栈,等下要做比对
stk.push(s[i]);
break;
case ')':
// 若是辅助栈是空的,或者栈顶的元素不匹配,就说明不是有效括号序列(消消乐)
if (stk.empty() || stk.top() != '(') return false;
stk.pop(); // 若能配对,就把此“左”从栈中弹出,相当于二者消掉
break;
// 以下都是同理
case ']':
// 若是辅助栈是空的,或者栈顶的元素不匹配,就说明不是有效括号序列(消消乐)
if (stk.empty() || stk.top() != '[') return false;
stk.pop(); // 若能配对,就把此“左”从栈中弹出,相当于二者消掉
break;
case '}':
// 若是辅助栈是空的,或者栈顶的元素不匹配,就说明不是有效括号序列(消消乐)
if (stk.empty() || stk.top() != '{') return false;
stk.pop(); // 若能配对,就把此“左”从栈中弹出,相当于二者消掉
break;
}
}
return stk.empty(); // 最终若是有效序列,则辅助栈是空,因为都消掉了
}
};
AB4 逆波兰表达式求值
关键思路:栈,遇到数字压入栈中,遇到运算符,就弹出栈顶两个元素计算,计算后再压入栈中 先判断的是否是运算符,遇到好多坑点,注意一下;还有就是,这里有负数,所以我们用stoi这个函数来转换成数字,减少一部分麻烦;
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param tokens string字符串vector
* @return int整型
*/
// 默认操作有意义
// 可能会有负数
// 还有就是vector里面是string,不是char
int evalRPN(vector<string>& tokens) {
// write code here
stack<int> stk;
int lenT = tokens.size();
for (int i = 0; i < lenT; ++i) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "/" || tokens[i] == "*") {
int k = stk.top();
stk.pop();
int x = stk.top();
stk.pop();
if (tokens[i][0] == '+') x += k;
else if (tokens[i][0] == '*') x *= k;
else if (tokens[i][0] == '-') x -= k;
else x /= k;
stk.push(x);
}else {
stk.push(stoi(tokens[i]));
}
}
return stk.top();
}
};