DS-012 棧-括號匹配
阿新 • • 發佈:2018-12-13
假設一個算術表示式中包含圓括號、方括號和花括號三種類型的括號,編寫一個演算法來判別表示式中的括號是否配對,以字元‘\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; } }