import java.io.InputStreamReader;
import java.io.BufferedReader;
/**
Class BracketChecker
Description 堆栈实例(二)--通配字符串
分隔符匹配程序每次从字符串中读取一个字符,若发现他是左分隔符,将它压入栈,当从
输入中读到一个右分隔符时,弹出栈顶的左分隔符,并且检查他是否和右分隔符匹配。
(1)如果不匹配则程序报错。
(2)栈中没有匹配的左括号或右括号。表现为在字符串中读到了一个右括号,而堆栈已空。
(3)或者栈中存在没有被匹配的分隔符程序也报错,其表现为把所有的字符串都读完了,
栈中还留有分隔符。
方法可行性在于,最后出现的左分隔符,最先要匹配,符合堆栈先进后出的特点
Company opendata
Author Chenlly
Date 2009/02/18
Vesion 1.0
*/
class StackX{
private int max_size;
private char[] charArray;
private int top;
//默认构造函数
public StackX(){
//do something;
}
//构造函数对成员变量初始化
public StackX(int nMax){
charArray = new char[nMax];
top=-1;
max_size=nMax;
}
//查看堆栈是否为空
public boolean isEmpty(){
return top==-1;
}
//查看堆栈顶元素
public char peek(){
return charArray[top];
}
//进栈操作
public void push(char chDate) throws Exception{
if(top==max_size){
throw new Exception("堆栈已满,请出栈操作");
} else{
charArray[++top]=chDate;
}
}
//出栈操作
public char pop() throws Exception{
if(top==-1){
throw new Exception("堆栈已空,请进行入栈操作");
}else{
char temp=charArray[top];
charArray[top--]=' ';//内存回收
return temp;
}
}
}//end StackX
public class BrackedChecker{
public String str;
//构造方法
public BrackedChecker(String str){
this.str=str;
}
//从键盘上读取字符串
public static String readString(){
String str="";
try{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
str=br.readLine();
}catch(Exception ex){
ex.printStackTrace();
}
return str;
}
//检验字符串是否匹配
public void check(){
StackX Stack=new StackX(str.length());
boolean bError=false;//是否犯了三种情况;默认为没有
for(int i=0;i<str.length();i++){
char ch=str.charAt(i);
switch(ch){
case '(':
case '[':
case '{': try{Stack.push(ch);}catch(Exception ex){ex.printStackTrace();} break;
case ')':
case ']':
case '}':
if (!Stack.isEmpty()){//情况(1)
char chPop=' ';
try{
chPop=Stack.pop();
}catch(Exception ex){
ex.printStackTrace();
}
if((ch==')'&&chPop!='(')||(ch==']'&&chPop!='[')||(ch=='}'&&chPop!='{')){
System.out.println("the error '"+ch+"'at:"+i);
bError=true;
}
}else{//堆栈已经空了。情况(2)
System.out.println("the error '"+ch+"'at:"+i);
bError=true;
}
break;
}//end switch
}//end for
if(!Stack.isEmpty()){//情况(3)
System.out.println("Error:Miss the right");
bError=true;
}else if(!bError){//当且仅当堆栈为空,并且没有犯上面三种情况的时候,才是正确的匹配
//符合通配符匹配要求
System.out.println("此字符串匹配");
}
}
//主调函数
public static void main(String []args){
System.out.println("Please Enter String:");
String inputStr=BrackedChecker.readString();
BrackedChecker bc=new BrackedChecker(inputStr);
bc.check();
}//end main
}//end BrackedChecker