棧的應用:平衡符號問題

【問題描述】:初學者在編寫代碼並且編譯時,難免會因爲少寫了一個')'和被編譯器報錯。也就是說,編譯器會去匹配括號是否匹配。當你輸入了一個'(',很自然編譯器回去檢查你是否有另一個')'符號與之匹配。如果所有的括號都能夠成對出現,那麼編譯器是能夠通過的。否則編譯器會報錯。例如字符序列“(a+b)”是匹配的,而字符序列"(a+b]"則不是。

在檢測括號匹配的算法中使用到了棧,算法描述如下:創建一個空棧,讀取字符序列直到結尾。如果字符是開放符號'(''[''{',將其入棧;如果是一個封閉符號')'']''}',則當棧爲空時報錯(不匹配),否則,將棧頂元素彈出,如果彈出的符號不是對應的開放符號,則報錯(不匹配)。

注意:本題目和前面的一篇博文《2014年有道研發崗算法題(9月17):規則序列問題 》有區別,採用棧實現規則序列問題無法找到最優解。

Java實現代碼如下:

轉載時請註明來源:http://blog.csdn.net/ccfeng2008

代碼測試通過

public class BalanceSymbol {
	public static boolean balance(String str) {
		if (str == null || (str = str.trim()).trim().equals(""))
			return true;
		Stack<Character> stack = new Stack<Character>();
		boolean flag = true;
		char tmp;
		for (int i = 0, len = str.length(); i < len; i++) {
			tmp = str.charAt(i);
			if (tmp == '(' || tmp == '[' || tmp == '{')
				stack.push(tmp);
			if (tmp == ')' && (stack.isEmpty() || stack.pop() != '(')) {
				flag = false;
				break;
			}
			if (tmp == ']' && (stack.isEmpty() || stack.pop() != '[')) {
				flag = false;
				break;
			}
			if (tmp == '}' && (stack.isEmpty() || stack.pop() != '{')) {
				flag = false;
				break;
			}
		}
		return flag && stack.isEmpty();
	}

	public static void main(String[] args) {
		System.out.println(balance("()"));//true
		System.out.println(balance("{}"));//true
		System.out.println(balance("[]"));//true
		System.out.println(balance("([{}])"));//true
		System.out.println(balance("([)]"));//false
		System.out.println(balance("(([])[()]{[]})"));//true
		System.out.println(balance("{}(([])[()]{[]}[)"));//false
	}

}


發佈了24 篇原創文章 · 獲贊 17 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章