注:下文代碼主要來自參考書籍,本人稍稍修改了一下。
泛型棧類:
package com.heyang;
/**
* 棧數據結構
* 說明:
* 作者:何楊(heyang78@gmail.com)
* 創建時間:2011-1-15 上午07:51:09
* 修改時間:2011-1-15 上午07:51:09
*/
public class MyStack<T>{
private int size; // 大小
private T[] datas; // 數據
private int top; // 棧頂元素下標
@SuppressWarnings("unchecked")
public MyStack(int size){
this.size=size;
datas= (T[])new Object[this.size];
top=-1;
}
/**
* 壓棧
*/
public void push(T t){
datas[++top]=t;
}
/**
* 出棧
*
* 說明:
* @return
* 創建時間:2011-1-15 上午08:01:15
*/
public T pop(){
return datas[top--];
}
/**
* 取得棧頂元素
*
* 說明:
* @return
* 創建時間:2011-1-15 上午08:02:02
*/
public T getTopItem(){
return datas[top];
}
/**
* 查看棧是否為空
*
* 說明:
* @return
* 創建時間:2011-1-15 上午08:02:38
*/
public boolean isEmpty(){
return top==-1;
}
}
括號檢查類:
package com.heyang;
/**
* 表達式中括號檢查類
* 說明:
* 作者:何楊(heyang78@gmail.com)
* 創建時間:2011-1-15 上午08:05:25
* 修改時間:2011-1-15 上午08:05:25
*/
public class BracketChecker{
private String input; // 輸入:待檢查的表達式
private boolean isValid; // 是否檢查通過
private String checkResult; // 輸出:檢查結果
/**
* 構造函數
* @param input
*/
public BracketChecker(String input){
this.input=input;
this.isValid=false;
this.checkResult="";
check();
}
/**
* 執行檢查
*
* 說明:
* 創建時間:2011-1-15 上午08:09:25
*/
private void check(){
int length=input.length();
MyStack<Character> stack=new MyStack<Character>(length);
for(int i=0;i<length;i++){
char c=input.charAt(i);
switch(c){
case '{':
case '[':
case '(':
stack.push(c);
break;
case '}':
case ']':
case ')':
if(stack.isEmpty()==false){
char top=stack.pop();
if( (c=='}' && top!='{') || (c==']' && top!='[') || (c==')' && top!='(') ){
isValid=false;
checkResult="經檢查,表達式'"+input+"'中,位于第"+(i+1)+"的字符‘"+c+"’沒有對應的匹配項";
return;
}
}
else{
isValid=false;
checkResult="經檢查,表達式'"+input+"'中,位于第"+(i+1)+"的字符‘"+c+"’沒有對應的匹配項";
return;
}
break;
default:
break;
}
}
if(stack.isEmpty()==false){
isValid=false;
checkResult="經檢查,表達式'"+input+"'中右括號缺失,匹配不完整";
return;
}
else{
isValid=true;
checkResult="經檢查,表達式'"+input+"'中括號匹配無誤.";
return;
}
}
/**
* 括號是否匹配
*
* 說明:
* @return
* 創建時間:2011-1-15 上午08:39:38
*/
public boolean isValid() {
return isValid;
}
/**
* 取得檢查結果
*
* 說明:
* @return
* 創建時間:2011-1-15 上午08:39:27
*/
public String getCheckResult() {
return checkResult;
}
public static void main(String[] args){
String[] arr={"1+(2/3-4","[1+(2/3-4)]*5","{[1+(2/3-4)]*5+(6+2*3)}*7","{[1+(2/3-4]*5+(6+2*3)}*7"};
for(String str:arr){
BracketChecker c=new BracketChecker(str);
System.out.println(c.getCheckResult());
}
}
}
檢查結果:
經檢查,表達式'1+(2/3-4'中右括號缺失,匹配不完整
經檢查,表達式'[1+(2/3-4)]*5'中括號匹配無誤.
經檢查,表達式'{[1+(2/3-4)]*5+(6+2*3)}*7'中括號匹配無誤.
經檢查,表達式'{[1+(2/3-4]*5+(6+2*3)}*7'中,位于第11的字符‘]’沒有匹配項
參考書籍:SAMS的《Java數據結構與算法》第四章