Delimiter matching problem: Write a program that determines whether the delimiters in a Java statement match.
A delimiter and its matching delimiter can be separated by other delimiters, that is, the delimiter allows nesting, so a delimiter can be matched only if all the right delimiters in front of it are matched.
For example, a conditional statement: if (i!= (n[8] +1)), the first opening parenthesis must match the last closing parenthesis, but this can only be done if the second opening parenthesis matches the penultimate right parenthesis. , and the second bracket matches only after the third opening parenthesis matches the third closing bracket.
Visible, the first occurrence of the left delimiter in order to be matched at the end, this processing and stack structure of the advanced characteristics of the back of the match.
The separator matching algorithm is as follows:
Scans the Java statements from left to right, reading the characters constantly from the statement, read one character at a time, if it is found to be a separator, press it into the stack, and when the first right separator is read from the input, then the left separator on top of the stack pops up and determines if it matches the right delimiter, if it does not match, the match fails, and the program complains If there is no left delimiter in the stack that matches the right delimiter (that is, the stack is empty), or there has been no matching left delimiter, the left delimiter is not matched, the performance of all elements are read, the stack still has a separator, the match fails, the program error; if all the characters read in the end, the stack is empty, then the match is successful.
Package com.stacktest;
Import Java.util.Scanner;
Import javax.swing.text.AbstractDocument.LeafElement; public class Separator {private final int left = 0;
The record delimiter is the "left" separator private final int right=1; Private final int other = 2; Record the type of other character//judgment separator, there are three illegal public int verifyflag (String str) {if ("("). Equals (str) | | [". Equals (str) | |" {". Equals (str) | |"
/* ". Equals (str)) {return left; else if (")". Equals (str) | | "]". Equals (str) | | "}". Equals (str) | |
"*/". Equals (str)) {return right;
else {return other; }///Match left delimiter str1 and right delimiter str2 match public boolean matches (String str1,string str2) {if (("(). E Quals (STR1) && ")". Equals (str2)) | | ("[". Equals (STR1) && "]". Equals (str2) | | ("{". Equals (STR1) && "}". Equals (str2) | | ("/*". Equals (STR1) && "* *". Equals (STR2)) {return true;
else {return false; } Private Boolean Islegal (String str) throws Exception {if (!). Equals (str) && str!= null) {sqstack s=new sqstack (100);
New sequential stack int length=str.length (); for (int i = 0; i < length; i++) {char c=str.charat (i);//specify indexed char value str
ing t=string.valueof (c);
if (i!= length) {if (('/' = = C && ' * ' = = Str.charat (i+1)) | |
(' * ' = = c && '/' = = Str.charat (i+1))]
{T=t.concat (string.valueof (Str.charat (i+1)));
++i; } if (left = = Verifyflag (t)) {S.push (t);
Press into Stack} else if (right = = Verifyflag (t)) {if (S.isempty () | |!matches (S.POP (). tostr
ing (), t)) {throw new Exception ("ERROR: Invalid Java statement"); }} if (!s.isempty ()) {throw new Exception ("Error: JA
VA Grammar not valid ");
return true;
else throw new Exception ("Error: Java statement is empty");
public static void Main (string[] args) throws Exception {Separator se=new Separator ();
System.out.println ("Please enter Java statement");
Scanner sc=new Scanner (system.in);
if (Se.islegal (Sc.nextline ())) {System.out.println ("Java statement valid");
else {System.out.println ("error, Java statement not valid");
}
}
}