下面的代码会出现编译错误:“。class”预期:
Stack<Character> stack=new Stack<Character>();
char pop=stack.pop();
但如果我改成这个,编译成功:
char pop;
Stack<Character> stack=new Stack<Character>();
pop=stack.pop();
是什么原因?
完整代码在这里:
public class Solution {
public boolean isValid(String s) {
//char pop;
if(s==null||s.length()==0)return true;
Stack<Character> stack=new Stack<Character>();
stack.push(s.charAt(0));
for(int i=1;i<s.length();i++){
char c=s.charAt(i);
if(c=='('||c=='['||c=='{')
stack.push(c);
else{
if(!stack.isEmpty())
char pop=stack.pop();
else
return false;
if(c==')'&&pop!='(') return false;
else if(c==']'&&pop!='[') return false;
else if(c=='}'&&pop!='{') return false;
}
}
return stack.isEmpty();
}
}
答案 0 :(得分:1)
您在if条件中使用pop作为局部变量。它应该是全局的,因为您稍后使用pop值。
虽然在其他情况下不会使用流行音乐。但它仍然会显示编译错误
在您的代码段中:
else{
if(!stack.isEmpty())
char pop=stack.pop(); // Here you initialized the value inside a condition.
else
return false;
if(c==')'&&pop!='(') return false;
else if(c==']'&&pop!='[') return false;// Using the value.
else if(c=='}'&&pop!='{') return false;// Using the value.
}
答案 1 :(得分:1)
如果你的代码会编译
if (!stack.isEmpty())
char pop = stack.pop();
else
与(表示变量范围的通知{...}
括号)相同
if (!stack.isEmpty()){
char pop = stack.pop();
} else
因此,这意味着您只是获得stack.pop()
的结果并将其存储在变量char pop
中,而该变量if
无法在此块之外的任何位置访问。
由于该指令是唯一一个在pop()
条件成功的情况下执行的指令,这意味着char pop
的存储结果是冗余的并且是设计问题的标志。
要解决此问题,请在if
语句之前的某处声明if
,以便在char pop; //make sure that this variable will be initialized before you use it
if (!stack.isEmpty())
pop = stack.pop();
else
阻止之后访问它。
{{1}}
答案 2 :(得分:0)
问题可能存在于以下代码中:
if(!stack.isEmpty()) // here you will need to provide curly braces to define pop's scope
char pop=stack.pop();
另外,如果您在外面声明pop
,我会在您的注释代码//char pop
中看到它,如果条件在您尝试时更有意义,则必须删除上面的pop声明在if条件之外使用它。