堆棧應用——括號匹配問題

  堆棧是各類軟件系統中應用最普遍的數據結構之一。括號匹配問題和表達式計算是編譯軟件中的基本問題,其軟件設計中都須要用到堆棧。java

【括號匹配問題】數組

  假設一個算術表達式中包含圓括號、方括號和花括號三種類型括號,編寫一個判別表達式中括號是否正確匹配配對的函數,並設計一個測試主函數。數據結構

【設計分析】 括號匹配後到的括號要最早被匹配,知足堆棧「後進先出」的操做特色。函數

  括號匹配有如下4種狀況:測試

  (1)左右括號配對次序不正確;spa

  (2)右括號多於左括號;設計

  (3)左括號多於右括號;code

  (4)括號匹配正確。blog

  

【源代碼】字符串

SeqStackTest.java

 1 package seqstack;
 2 
 3 public class SeqStackTest { 
 4     //遍歷字符數組並利用進棧出棧匹配括號  
 5     static void expIsCorrect(String[] exp,int n)throws Exception{  
 6         SeqStack myStack = new SeqStack(100);  
 7         //LinStack myStack = new LinStack(); //也能夠用鏈式堆棧  
 8         for(int i=0;i<n;i++){//若是是左括號就入棧  
 9             if((exp[i].equals(new String("(")))  
10                     || (exp[i].equals(new String("[")))  
11                     || (exp[i].equals(new String("{"))))  
12                 myStack.push(exp[i]);  
13             //若是是右括號)而且和棧頂(匹配,出棧  
14             else if((exp[i].equals(new String(")"))) && myStack.notEmpty()  
15                     && myStack.getTop().equals(new String("(")))  
16                 myStack.pop();  
17             //遍歷的右括號)和棧頂不匹配,說明公式錯誤,結束遍歷  
18             else if((exp[i].equals(new String(")"))) && myStack.notEmpty()  
19                     && !myStack.getTop().equals(new String("("))){  
20                 System.out.println("左右括號匹配次序不正確!");  
21                 return;  
22             }  
23             //若是是右括號]而且和棧頂[匹配,出棧  
24             else if((exp[i].equals(new String("]"))) && myStack.notEmpty()  
25                     && myStack.getTop().equals(new String("[")))  
26                 myStack.pop();  
27             //遍歷的右括號]和棧頂不匹配,說明公式錯誤,結束遍歷  
28             else if((exp[i].equals(new String("]"))) && myStack.notEmpty()  
29                     && !myStack.getTop().equals(new String("["))){  
30                 System.out.println("左右括號匹配次序不正確!");  
31                 return;  
32             }  
33             //若是是右括號}而且和棧頂{匹配,出棧  
34             else if((exp[i].equals(new String("}"))) && myStack.notEmpty()  
35                     && myStack.getTop().equals(new String("{")))  
36                 myStack.pop();  
37             //遍歷的右括號}和棧頂不匹配,說明公式錯誤,結束遍歷  
38             else if((exp[i].equals(new String("}"))) && myStack.notEmpty()  
39                     && !myStack.getTop().equals(new String("{"))){  
40                 System.out.println("左右括號匹配次序不正確!");  
41                 return;  
42             }  
43             //若是棧已空,但還存在右括號,說明右括號多了  
44             else if((exp[i].equals(new String(")")))  
45                     || (exp[i].equals(new String("]")))  
46                     || (exp[i].equals(new String("}")))  
47                     && !myStack.notEmpty()){  
48                 System.out.println("右括號多餘左括號!");  
49                 return;  
50             }  
51         }  
52         //遍歷完成後棧內還有元素,說明左括號多了  
53         if(myStack.notEmpty())  
54             System.out.println("左括號多餘右括號!");  
55         else  
56             System.out.println("括號匹配正確!");  
57     }  
58       
59     private static String[] strToString(String str){//把字符串轉換爲String類型數組  
60         //爲何不轉換爲字符數組char[]呢?  
61         //由於只有String類型的數據才具備可比性,也就是能用equals  
62         int n = str.length();  
63         String[] a = new String[n];  
64         for(int i=0;i<n;i++){  
65             a[i] = str.substring(i,i+1);//取子串含頭不含尾,故能夠取出i位置的字符並返回字符串類型  
66         }  
67         return a;  
68     }  
69       
70     public static void main(String[] args) {  
71         String str;  
72         int n;  
73         try{  
74             str = "(())abc{[}(){";//左右括號匹配次序不正確  
75             n = str.length();  
76             String[] a = strToString(str);  
77             expIsCorrect(a,n);  
78               
79             str = "(()))abc{[]}";//右括號多餘左括號  
80             n = str.length();  
81             String[] b = strToString(str);  
82             expIsCorrect(b,n);  
83               
84             str = "(()()abc{[]}";//左括號多餘右括號  
85             n = str.length();  
86             String[] c = strToString(str);  
87             expIsCorrect(c,n);  
88               
89             str = "(())abc{[]}";//括號匹配正確!  
90             n = str.length();  
91             String[] d = strToString(str);  
92             expIsCorrect(d,n);  
93         }  
94         catch(Exception e){  
95             System.out.println(e.getMessage());  
96         }  
97   
98     }  
99 }  

 

Stack.java

1 package seqstack;
2 
3 public interface Stack {
4     public void push(Object obj)throws Exception;
5     public Object pop()throws Exception;
6     public Object getTop()throws Exception;
7     public boolean notEmpty();
8 }

 

SeqStack.java

package seqstack;

public class SeqStack implements Stack{
    final int defaultSize=10;
    int top;
    Object[] stack;
    int sizeMaxSize;
    
    public SeqStack(int sz)
    {
        initiate(sz);
    }

    private void initiate(int sz) {
        // TODO Auto-generated method stub
        sizeMaxSize=sz;
        top=0;
        stack=new Object[sz];
    }
    
    public void push(Object obj)throws Exception{
        if(top == sizeMaxSize)
        {
            throw new Exception("堆棧已滿!");
        }
        stack[top] = obj;
        top++;
    }
    
    public Object pop()throws Exception{
        if(top == 0)
        {
            throw new Exception("堆棧已空!");
        }
        top--;
        return stack[top];
    }
    
    public Object getTop()throws Exception{
        if(top == 0)
        {
            throw new Exception("堆棧已空!");
        }
        return stack[top-1];
    }
    public boolean notEmpty(){
        return(top>0);
    }
    
    
}

 

【運行結果】

相關文章
相關標籤/搜索