1. 程式人生 > >DS-012 棧-括號匹配

DS-012 棧-括號匹配

假設一個算術表示式中包含圓括號、方括號和花括號三種類型的括號,編寫一個演算法來判別表示式中的括號是否配對,以字元‘\0’作為算術表示式的結束符。

演算法思想:

遇到左括號,依次入棧,且後入棧的左括號更急迫期待配對;遇到右括號,取出棧頂括號,檢查是否和這個右括號配對。如果匹配不成功,直接返回括號序列不匹配。如果配對成功,取出的棧頂的左括號得以消解;新的棧頂括號成為最急需配對的左括號,期待與下一個檢查的右括號匹配;演算法結束時,棧為空,匹配成功。

程式碼:

bool BracketsCheck(char *str){
	InitStack(S);
	int i = 0;
	while (str[i]!='\0'){
		switch(str[i]) //滿足哪種情況,執行對應的程式碼;都沒有匹配的,執行default: 
		{
			case '(' : Push(S, '('); break; // 遇到三種左括號,依次壓入棧中 
			case '[' : Push(S, '['); break;
			case '{' : Push(S, '{'); break; 
			
			case ')' : Pop(S, e);  //遇到右括號不用入棧,檢查棧頂括號和這個右括號是不是一對兒 
				if(e!='(') return false; 
				break;
			case ']' : Pop(S, e); 
				if(e!='[') return false; 
				break;
			case '}' : Pop(S, e);  
				if(e!='{') return false;
				break;
				
			default: break; 
		} //每次操作一個元素,操作完成跳出switch,回到while迴圈
	i++; // 字串末尾為'\0',遍歷整個字串,直到末尾,跳出while迴圈 
	}
	if(!IsEmpty(S)){ //如果最後棧不為空,匹配失敗 
		printf("括號不匹配\n.");
		return false;
	}
	else{
		printf("括號匹配。\n");
		return true;
	}
}