2012-10-14 39 views
0

我正在编写的程序必须读取已加载的文本文件,并检查是否所有(,[和{均衡以及忽略了之间的任何内容“。到目前为止,我已检查前三个符号是否全部平衡,但我在检查首次发生的行号时遇到了麻烦,我知道如果下一个符号是“or//我忽略该行或直到我打了下一个”,但我不能确定正确的语法的任何帮助,将不胜感激这是我到目前为止有:。Java Stack Sort Symbol Balancing

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

import java.util.*; 
import java.io.*; 

import javax.swing.filechooser.*; 
import javax.swing.text.BadLocationException; 

public class Sorting extends JFrame implements ActionListener{ 



    private Stack<Character> symbolStack; 



    JTextArea opentextArea; 
    JTextArea placetextArea; 
    JMenuItem open; 
    final JFileChooser fc = new JFileChooser(); 

    public static void main(String [] args) 
    { 
     Sorting gui = new Sorting(); 




    } 




    public Sorting() 
    { 




     JFrame frame = new JFrame(); 
     setLayout(new GridLayout(1,2)); 
     setTitle("Stack Sort"); 

     JMenuBar menuBar = new JMenuBar(); 
     JMenu menuItems = new JMenu("File"); 
     open = new JMenuItem("Open"); 
     open.addActionListener(this); 
     JMenuItem reset = new JMenuItem("Reset"); 


     reset.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent e) 
        { 
         opentextArea.setText(""); 
         placetextArea.setText(""); 
        } 
       } 
      ); 

     menuItems.add(open); 
     menuItems.add(reset); 

     menuBar.add(menuItems); 
     setJMenuBar(menuBar); 
     opentextArea = new JTextArea(); 
     placetextArea = new JTextArea(); 
     add(opentextArea); 
     add(placetextArea); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    pack(); 
    setVisible(true); 


    } 




    public void actionPerformed(ActionEvent event) 
    { 

     int returnVal = fc.showOpenDialog(this); 

     if (returnVal == JFileChooser.APPROVE_OPTION) 
     { 

      File file = fc.getSelectedFile(); 
      FileInputStream is = null; 
      try 
      { 
       is = new FileInputStream(file); 
      } 
      catch (FileNotFoundException e) 
      { 
       System.out.println("Exception: " + e.toString()); 
      } 


      byte [] nextChar = new byte[2]; 

      try 
      { 

       int value = is.read(nextChar); 
       int num = 1; 
       opentextArea.append(num + ":"); 


       while (value != -1) 
       { 
        String newString = new String(nextChar); 
        if (nextChar[0] == '\n' || nextChar[0] == '\r') 
        { 
         num++; 
         opentextArea.append(newString + num + ":"); 

        } 
        else 
         opentextArea.append(newString); 


        value = is.read(nextChar); 

       } 


      } 
      catch (IOException e) 
      { 
       System.out.println("Exception: " + e.toString()); 
      } 


      Stack<Character> stack = new Stack<Character>(); 
      String s = opentextArea.getText(); 
      int index = 0; 
      int numline = 1; 
      while(index < s.length()) { 
       char ch = s.charAt(index); 
       if (ch == '\n' || ch == '\r') 
        { 
         numline++; 
         index++; 
        } 
       else 
       if(ch == '{' || ch == '[' || ch == '(') 
        { 
         stack.push(ch); 
         index++; 
        } 
       else { 
        if(stack.empty()) 
        { 
         index++; 
         //placetextArea.append("No balance characters found."); 
         continue; 
        } 

        char ch1 = stack.pop(); 

        if(ch1 == '{' && ch == '}' || ch1 == '[' && ch == ']' || ch1 == '(' && ch == ')') 
        { 
         placetextArea.append(ch1 + " at line " +numline + " matches up with " + ch + " at line " + numline + "\n"); 
        } 
        else 
         if(ch1 == '{' && ch != '}' || ch1 == '[' && ch != ']' || ch1 == '(' && ch != ')') 
         { 
          placetextArea.append("error unmatched " + ch1 + "at line " +numline); 
          break; 
         } 
        } 

       } 






    } 
} 
} 

这是我编辑的代码:

Stack<Character> stack = new Stack<Character>(); 
     String s = opentextArea.getText(); 
     int index = 0; 
     int numline = 1; 
     while(index < s.length()) { 
      char ch = s.charAt(index); 
      if (ch == '\n' || ch == '\r') 
       { 
        numline++; 
        index++; 
       } 
      else 
      if(ch == '{' || ch == '[' || ch == '(') 
       { 
        stack.push(ch); 
        index++; 
       } 
      else { 
       if(stack.empty()) 
       { 
        index++; 
        //placetextArea.append("No balance characters found."); 
        continue; 
       } 
       // pop an item from stack 
       if(ch == '}' || ch == ']' || ch == ')') 
       { 
       char ch1 = stack.pop(); 
       // check if it's a matching pair 
       if(ch1 == '{' && ch == '}' || ch1 == '[' && ch == ']' || ch1 == '(' && ch == ')') 
       { 
        placetextArea.append(ch1 + " at line " +numline + " matches up with " + ch + " at line " + numline + "\n"); 
       } 
       else 
        if(ch1 == '{' && ch != '}' || ch1 == '[' && ch != ']' || ch1 == '(' && ch != ')') 
        { 
         placetextArea.append("error unmatched " + ch1 + "at line " +numline); 
         break; 

        } 
       } 

      } 






} 
+0

您不必以这种方式编辑您的帖子。如果每个人都这样做,如何利用资本并分享知识?请取消您上次的编辑。 – Aubin

回答

2

只有遇到),}]中的一个时,才需要从堆栈弹出。然后你检查一下是否与开幕式相符。你也需要在无与伦比的情况下定义一种行为:推开或放弃。在EOF你应该检查堆栈是否为空。否则,你有不平衡的东西。

+0

是的,你定义了 - 你把弹出的支架放在地板上。要知道为什么你需要在EOF中检查栈是否为空,请考虑以下文本(它是一个完整的文件内容):'('。 – Serge

+0

抱歉,我的prev声明关于冻结是错误的,但无论如何,你应该删除现有的'if stack.empty()){...}'当遇到闭合符号时,你需要检查堆栈是否为空,因为它没有匹配的开放符号也是不平衡的。不要忘记撞上索引(这是冻结的真正原因) – Serge