2016-04-23 81 views
1

我正在制作一个程序来检查大括号在另一个程序中是否平衡,并且我在静态与非静态变量方面遇到了问题。它说我无法从静态上下文中引用我的非静态堆栈,但我正在阅读文件,所以我必须更改堆栈。有什么建议么?谢谢!静态与非静态堆栈

public static void main(String[] args) 
{ 
    readFile(); 
    if(isBalanced() == true) 
     System.out.println("program is balanced"); 
    else 
     System.out.println("program is not balanced"); 
} 

private static void readFile() 
{ 
    try 
    { 
     Scanner fin = new Scanner(new File("test.txt")); 

     while(fin.hasNext()) 
     { 
      s.add(fin.nextLine()); 
      System.out.println(""); 
     } 
    }catch(IOException ex) 
    { 
     System.out.println("File Not Found"); 
    } 
} 

public static boolean isBalanced() 
{ 
    Stack<Character> stack = new Stack<Character>(); 

    for(int i = 0; i < s.length(); i++) 
    { 
     if(s.charAt(i) == LEFT_PARENT) 
      stack.push(LEFT_PARENT); 
     else if(s.charAt(i) == LEFT_BRACE) 
      stack.push(LEFT_BRACE); 
     else if(s.charAt(i) == LEFT_BRACKET) 
      stack.push(LEFT_BRACKET); 
     else if(s.charAt(i) == LEFT_POINT) 
      stack.push(LEFT_POINT); 
     else if(s.charAt(i) == RIGHT_PARENT) 
     { 
      if(stack.isEmpty()) 
       return false; 
      if(stack.pop() != LEFT_PARENT) 
       return false; 
     } 
     else if(s.charAt(i) == RIGHT_BRACE) 
     { 
      if(stack.isEmpty()) 
       return false; 
      if(stack.pop() != LEFT_BRACE) 
       return false; 
     } 
     else if(s.charAt(i) == RIGHT_BRACKET) 
     { 
      if(stack.isEmpty()) 
       return false; 
      if(stack.pop() != LEFT_BRACKET) 
       return false; 
     } 
     else if(s.charAt(i) == RIGHT_POINT) 
     { 
      if(stack.isEmpty()) 
       return false; 
      if(stack.pop() != LEFT_POINT) 
       return false; 
     } 
    } 
    return stack.isEmpty(); 
} 

}

回答

1

你的问题很可能是在代码中你没有显示的线路之一。没有这些代码我无法确定。

既然你使用了一个变量“s”,但从来没有在你所显示的代码中声明它,我假设它是在你的类中声明的,并且它不是静态的。因此,你不能在你的静态方法中使用这个变量(它们看起来都是这样的)。

要么使变量静态(这似乎是你在做什么),或者你需要弄清楚如何从你的主要方法实例化你的类。

这可能会解决这个问题,但你可能会有更多的...再次,我不能告诉没有所有的代码。