0

我的 Java 程序如下。这是我的训练练习。一个为特殊类型的字符串解析(带分隔符的字符串)实现堆栈结构。

这个分隔符匹配程序的工作原理是一次从字符串中读取一个字符,并在找到它们时将打开的分隔符放在堆栈上。当它从输入中读取结束分隔符时,它会从堆栈顶部弹出开始分隔符并尝试将其与结束分隔符匹配。如果它们不是同一类型(例如,有一个左大括号但有一个右括号),则会发生错误。此外,如果堆栈上没有与结束分隔符匹配的开始分隔符,或者如果没有匹配分隔符,则会发生错误。未匹配的分隔符被发现是因为在字符串中的所有字符都被读取后它仍保留在堆栈中。

我使用 Eclipse。我的输出在这里:

Please enter String:
{}
ch0 = {
ch1 = }
chLabel1 = **UNDEFINED CHAR(SQUARE WITH QUESTION MARK INSIDE IT)**
Error at }**

你能解释一下的价值chLabel吗?

据我了解运算符“|” (这里,因为两个操作数具有布尔类型) - 是“懒惰”,“||”的快捷版本 操作员。我在替换“|”后测试了程序 对于“||”-结果是一样的。

public class MyStack {
    private int top=0;
    private int maxSize=0;
    private char[] charArray=null;

    public MyStack(int size){
        maxSize=size;
        top=0;
        charArray=new char[maxSize];
    }

    public void push(char ch){
        charArray[top++]=ch;
    }

    public char pop(){
        return charArray[top--];
    }

    public boolean isEmpty(){
        if(top==0)          
        return true;
        else return false;
    }

    public boolean isFull(){
        if(top==(maxSize-1))            
        return true;
        else return false;
    }
}


class StringParse {
    private String stringForParsing = null;

    public StringParse(String string) {
        this.stringForParsing = string;
    }

    public void parser() {
        char[] chArr = stringForParsing.toCharArray();
        MyStack mySt = new MyStack(chArr.length);

        for (int i = 0; i < chArr.length; i++) {
            char ch = chArr[i];

            switch (ch) {
                case '{':
                case '(':
                case '[':
                    mySt.push(ch);
                    System.out.println("ch" + i + " = " + ch);
                    break;

                case '}':
                case ')':
                case ']':
                    if (mySt.isEmpty())
                        System.out.println("Error at" + ch);
                    else {
                        char chLabel = mySt.pop();
                        System.out.println("ch" + i + " = " + ch);
                        System.out.println("chLabel" + i + " = " + chLabel);

                        if ((chLabel == '{') && (ch == '}') | (chLabel == '(') && (ch == ')') | (chLabel == '[') && (ch == ']'))
                            break;

                        else {
                            System.out.println("Error at " + ch);
                            break;
                        } // end of second else
                    } //end of first else

                default:
                    break;
            } //end of switch
        } //end of parser method
    }
} //end of class


class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System. in ));
        System.out.println("Please enter String:");
        String s = br.readLine();

        StringParse strP = new StringParse(s);
        strP.parser();
    }
}
4

2 回答 2

0

MyStack你的班级可能有问题

使用java.util.Stack没有给我任何错误,只是一个“ chLabel1 = {

Error at }可以通过遵循 Dukeling 的建议并使用||代替来解决|

(chLabel == '{') && (ch == '}') || (chLabel == '(') && (ch == ')') || (chLabel == '[') && (ch == ']')

因此,看起来您的代码MyStack.pop()没有返回有效的char. 我需要查看您的MyStack代码以提供进一步帮助。

于 2013-08-22T15:36:02.283 回答
0

有两个问题:

  • 函数有错误pop

    考虑做一个push,然后一个pop

    top = 0
    push
      insert at position 0
      set top to 1
    pop
      get position 1 (not set yet!)
      set top to 0
    

    您需要使用前减量而不是后减量,所以charArray[top--]应该是charArray[--top].

    有了这个改变,我得到了chLabel1 = {.

  • 重申我在评论中所说的话......

    |的优先级高于&&(相对于其||具有较低的优先级)(参见)‌​,
    因此a && b | c && d与 相同a && (b | c) && d
    a && b || c && d不是(a && b) || (c && d).

    |'s更改为||'s 时,我不再得到Error at }.

于 2013-08-22T15:56:38.573 回答