堆栈-通配字符串

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值