合法括号的判断—难度:⭐⭐
我的答案:错误
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
if (n % 2 != 0) {
return false;
}
stack<char> st;
auto ch = A.begin();
// cout<<"hello?"<<endl<<*(A.begin())<<endl;
A.push_back(' ');
while (ch < A.end()) {
if (*ch != '(' && *ch != ')') {
return false;
}
if (*ch == '(') {
//cout<<*ch<<endl;
while (*ch == '(') {
st.push(*ch);
ch++;
}
if (*ch == ')') {
while (*ch == ')') {
st.pop();
ch++;
}
} else return false;
} else {
while (*ch == '(') {
st.push(*ch);
ch++;
}
if (*ch == ')') {
while (*ch == ')') {
st.pop();
ch++;
}
} else return false;
}
}
if (!st.empty()) {
return true;
}
return false;
}
};
错误点
- 解题思路正确,若匹配到左扩号,则入栈,若一直是左括号就一直入栈,若遇到右括号就弹栈抵消
- 编码错误,对思路进行代码化的能力欠缺
- 对思路进行整理后重新编码:
我的答案:修正版
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
if (n % 2 != 0) {
return false;
}
stack<char> st;
auto ch = A.begin();
// cout<<"hello?"<<endl<<*(A.begin())<<endl;
while (ch < A.end()) {
if (*ch == '(') {
//cout<<*ch<<endl;
while (*ch == '(') {
st.push(*ch);
ch++;
}
}
else
{
return false;
}
if (*ch == ')') {
while (*ch == ')') {
if(!st.empty())
{
st.pop();
++ch;
}
else
{
return false;
}
}
} else return false;
}
if (st.empty()) {
return true;
}
return false;
}
};
标准答案:switch语句直接搞定
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
stack<char> st;
for(auto ch:A)
{
switch(ch)
{
case '(':
st.push(ch);
break;
case ')':
if(st.empty())
{
return false;
}
st.pop();
break;
default:
return false;
}
}
return st.empty();
}
};