我的 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();
}
}