《Java數據結構和算法》棧 分隔符分配

分隔符包括「{「、"["、」(] )}」,每一個左分隔符須要右分隔符匹配。同時,在字符串中後出現左分隔符應該比早出現的先匹配。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

相關文章
相關標籤/搜索