遇到【匹配】问题可以考虑stack!
20. 有效的括号
思路:遍历string的每一位,用stack记录,遇到匹配的就pop掉,如果最后stack为空则说明都被匹配,return true。
优化点:如果string的长度为奇数则一定不匹配。
1047. 删除字符串中的所有相邻重复项
与上一题类似
也可以直接用一个string进行类似stack的操作。注意st.top()变为out.back(),st.pop()变为out.pop_back().
150. 逆波兰表达式求值
力扣
第一次看有点没看懂怎么运算的哈哈哈,但看了动画和说明明白了
大概就是依次push到stack里,遇到当前为【符号】的情况则要计算前面两位数字(e,g: 2 1 +,则需要计算2+1 = 3,然后用3覆盖2 1 +)。遇到数字直接push即可。
int evalRPN(vector<string>& tokens){
std::stack<long long> st; //注意类型为long long,避免数过大
for(int i = 0; i < tokens.size(); i++){
if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*"
|| tokens[i] == "/"){
long long second = st.top(); //注意second和first的顺序!从stack中pop和正常顺序是相反的!
st.pop();
long long first = st.top();
st.pop();
if(tokens[i] == "+"){
st.push(first + second);
} else if (tokens[i] == "-"){
st.push(first - second);
} else if (tokens[i] == "*"){
st.push(first * second);
} else if (tokens[i] == "/"){
st.push(first / second);
}
} else {
st.push(stoll(tokens[i]);
}
}
return st.top();
}