经典题目,但是我写的出了些问题,题干如下:
我的代码:
class Solution {
public:
stack<char> st;
bool isValid(string s) {
if(s.size() % 2 != 0) return false;//利用字符串长度是否为奇偶进行剪枝操作
for(char i : s){
//遍历左括号,压入右括号
if(i == '(') st.push(')');
else if(i =='[') st.push(']');
else if(i == '{') st.push('}');
else if(i != st.top() || st.empty()) return false;
else st.pop();
}
return st.empty();
}
};
出错了:
我让chat帮我看看,结果是这里:
原来是这里顺序反了:
else if(i != st.top() || st.empty()) return false;
正确顺序应该是这个:
else if(st.empty() || st.top() != i) return false;
编译成功了:
受教了,原来即使连接词是 || 两边的判断也不是完全独立的,仍然需要先判断栈是否为空再调用栈方法。