分隔符包括「{「、"["、」(」、「] 「、「)「、「}」,每一個左分隔符須要右分隔符匹配。同時,在字符串中後出現左分隔符應該比早出現的先匹配。java
程序從字符串中不斷讀取字符,每次讀取一個字符。若發現是左分隔符,壓入棧中;當讀到一個右分隔符,彈出棧的左分割符與其比較,若是不匹配則報錯。spa
棧中沒有左分隔符和右分隔符匹配/一直存在着沒有被匹配的分隔符,報錯。code
//棧 package StructureBracket; public class StackX { private int maxSize; private char[] stackArray; private int top; //構造器 public StackX(int s){ maxSize = s; stackArray = new char[maxSize]; top = -1; } public void push(char j){ stackArray[++top] = j; } public char pop(){ return stackArray[top--]; } public char peek(){ return stackArray[top]; } public boolean isEmpty(){ return(top == -1); } }
//匹配程序 package StructureBracket; public class BracketChecker { private String input; public BracketChecker(String in){ input = in; } public void check(){ int stackSize = input.length(); StackX theStack = new StackX(stackSize); for(int j=0;j<input.length();j++){ char ch = input.charAt(j); switch(ch){ case '{': case '[': case '(': theStack.push(ch); break; case '}': case ']': case ')': if(!theStack.isEmpty()){ char chx = theStack.pop(); if((ch=='}')&&(chx!='{')||(ch==']')&&(chx!='[') ||(ch==')')&&(chx!='(')) System.out.println("Error: "+ch+" at "+j); }else System.out.println("Error: "+ch+" at "+j); break; default: break; }//end switch }//end for if(!theStack.isEmpty())//若能執行到此步,說明以上只執行了push System.out.println("Error:missing right delimiter"); } }
//主程序 package StructureBracket; import java.io.IOException; import java.io.InputStreamReader; import java.io.BufferedReader; public class BracketsApp { public static void main(String[] args)throws IOException{ String input; while(true){ System.out.print("Enter string containing delimiters: "); System.out.flush(); input = getString(); if(input.equals("")) break; BracketChecker theChecker = new BracketChecker(input); theChecker.check(); } } private static String getString() throws IOException { // TODO Auto-generated method stub InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s = br.readLine(); return s; } }
轉換規則:字符串
(1)遇到操做數:直接寫至輸出out;get
(2)左括號(:push入棧;(3):右括號):pop出一項,若此項不是(則寫至out,如果(則退出循環;input
(3)若讀到操做符(+、-、*、/等):棧爲空,push推其入棧;棧非空,重複:pop一項,若爲(push其入 棧,若一樣爲操做符,比較其優先級:>棧頂push其入棧, ≤棧頂,輸出棧頂操做符,<棧頂退出循環;項爲(,將讀到的操做符push入棧;string
(4):以上步驟結束後,若棧非空,彈出寫至輸出out.it