此问题与hackerRank中的问题有关 - https://www.hackerrank.com/challenges/java-stack/problem
在循环中将Stack放入内部有什么不同?
如果我把Stack放在循环中,它对于模式' []'返回true,但是为false 如果我在课堂上采取它。
正确的答案应该是真的。
import java.util.*;
class Solution{
public static void main(String []argh)
{
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String input=sc.nextLine();
Stack<Character> stack = new Stack<>();
for( char c : input.toCharArray() ){
if( c == '{' || c == '(' || c =='['){
stack.push(c);
continue;
}
if( c == '}' && !stack.isEmpty() && stack.peek() == '{' ){
stack.pop();
continue;
}
if( c == ')' && !stack.isEmpty() && stack.peek() == '(' ){
stack.pop();
continue;
}
if( c == ']' && !stack.isEmpty() && stack.peek() == '[' ){
stack.pop();
continue;
}
if( c == '}' || c == ')'|| c == '['){
stack.push(c);
break;
}
} //end for
System.out.println(stack.isEmpty());
} //end while
} //end main
} //end class
答案 0 :(得分:1)
在循环内部,将在while循环的每次迭代中创建一个全新的堆栈。如果你把它放在类级别,那么在程序的生命周期中只会创建一个堆栈。
只有在您有多行输入时才会有所不同。
如果您只使用一个堆栈,那么该堆栈还将包含上一行输入的括号,使其成为可能:
{
false
}
true
首先,我输入了{
。这不平衡,所以false
。在下一行中,我输入了}
。它不应该平衡,但输出为true
。这是因为前一行的{
仍然在堆栈中!这就是为什么你应该为每一行创建一个新的堆栈(每次循环迭代)。
另一种方法是将堆栈放在类级别,但在每次迭代开始时调用clear
:
while (sc.hasNextLine()) {
stack.clear(); // <----
String input=sc.nextLine();
for( char c : input.toCharArray() ){