堆棧是各類軟件系統中應用最普遍的數據結構之一。括號匹配問題和表達式計算是編譯軟件中的基本問題,其軟件設計中都須要用到堆棧。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); } }
【運行結果】