问题:假设一个算术表达式只有“()","[]","{}",这3种类型的括号,编写一个算法判断表达时括号是否匹配,表达式以“\0"结尾。
算法思想:括号匹配是栈的一个典型的应用,当扫描到左括号时,将其入栈,当扫描到右括号时,从栈中弹出一个元素,同时判断是否匹配(如果栈为空,弹出的元素为空,此时一定不匹配),所以在遍历表达式的时候不用判断栈是否为空。按以上思想循环遍历表达式,如果扫描到"\0”字符时,并且,栈为空,则括号匹配。
代码如下:
1 bool BracketsCheck(char *str) 2 { 3 InitStack(S); //初始化栈 4 int i=0; 5 while(str[i]!='\0') 6 { 7 switch(str[i]) 8 { //左括号入栈 9 case '(':Push(S,str[i]);break; 10 case '[':Push(S,str[i]);break; 11 case '{':Push(S,str[i]);break; 12 //右括号出栈,并检查是否匹配 13 case ')':Pop(S,e); 14 if(e!='(') return false; 15 break; 16 17 case ']':Pop(S,e); 18 if(e!='[') return false; 19 break; 20 21 case '}':Pop(S,e); 22 if(e!='{') return false; 23 break; 24 default: 25 break; 26 }//switch 27 i++; //扫描下一个字符 28 }//while 29 if(!IsEmpty(s)) //栈不为空 30 { 31 printf("括号不匹配!\n"); 32 return false; 33 } 34 else 35 { 36 printf("括号匹配!\n"); 37 return true; 38 } 39 }