棧應用1(判定括號是否匹配)-筆記
阿新 • • 發佈:2018-12-28
問題:如何使用棧來判定括號是否匹配
解答:對於給定的表示式,可以使用棧來實現括號匹配判定演算法。這個演算法在編譯器中非常重要。解析器每次讀入一個字元,如果字元是一個開分隔符(如(、{、或 [ ),那麼將其入棧。若讀入的是一個閉分隔符(如)、}、或 ] ),那麼將棧頂的開分隔符出棧,並與閉分隔符比較。如果兩者匹配,則繼續解析字串。如果不匹配,解析器顯示匹配錯誤。下面給出一個時間複雜度為O(n)的基於棧的符號匹配判定演算法。
演算法:
a.建立一個棧。
b.當(當前字元不等於輸入的結束字元)
(1)如果當前字元不是匹配的字元,則忽略它。
(2)如果字元是一個開分隔符(如(、{ 或 [ ),那麼將其入棧。
(3)如果字元是一個閉分隔符(如)、} 或 ] ),且棧不為空,棧頂元素出棧,否則提示匹配錯誤。
c.字串處理結束後,如果棧不為空,則提示匹配錯誤。
public class DynArrayStack { private int top; private int capacity; private int array[]; public DynArrayStack(){ capacity=20; array=new int[capacity]; top=-1; } public boolean isEmpty(){ return (top==-1); } public boolean isStackFull(){ return (top==capacity-1); } public void push(int data){ if(isStackFull()) doubleStack(); array[++top]=data; } private void doubleStack(){ int newArray[]=new int[capacity*2]; System.arraycopy(array, 0, newArray, 0, capacity); capacity=capacity*2; array=newArray; } public int pop(){ if(isEmpty()) { //System.out.println("Stack Overflow"); return -1; } else return (array[top--]); } public void deleteStack(){ top=-1; } } /*public static void arraycopy(Object src, int srcPos,Object dest,int destPos, int length) 其中:src表示源陣列,srcPos表示源陣列要複製的起始位置,desc表示目標陣列,length表示要複製的長度。 */
public class Firsttest { public static void main(String args[]){ DynArrayStack array1=new DynArrayStack(); String s1; Scanner reader=new Scanner(System.in); s1=reader.next(); int i=0; while(i<s1.length()){ char c = s1.charAt(i); switch (c) { case '(': case '{': case '[': array1.push(c); break; case ')': if(array1.isEmpty()||array1.pop()!='(') { System.out.println("括號匹配錯誤"); return; } break; case '}': if(array1.pop()!='{'||array1.isEmpty()){ System.out.println("括號匹配錯誤"); return; } break; case ']':if(array1.pop()!='['||array1.isEmpty()){ System.out.println("括號匹配錯誤"); return; } break; default: } i++; } if(array1.isEmpty()) System.out.println("括號匹配正確"); else System.out.println("括號匹配錯誤"); } }