1. 程式人生 > >棧應用1(判定括號是否匹配)-筆記

棧應用1(判定括號是否匹配)-筆記

問題:如何使用棧來判定括號是否匹配
解答:對於給定的表示式,可以使用棧來實現括號匹配判定演算法。這個演算法在編譯器中非常重要。解析器每次讀入一個字元,如果字元是一個開分隔符(如(、{、或 [ ),那麼將其入棧。若讀入的是一個閉分隔符(如)、}、或 ] ),那麼將棧頂的開分隔符出棧,並與閉分隔符比較。如果兩者匹配,則繼續解析字串。如果不匹配,解析器顯示匹配錯誤。下面給出一個時間複雜度為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("括號匹配錯誤");
}
}