棧的應用之括號匹配問題
阿新 • • 發佈:2018-12-26
給一個字串,那這個程式是可以檢測你的字串中所含的括號是否匹配。 原理是:我們從左向右遍歷字串,如果我們遇到左括號如‘(’,我們就將這個左括號進棧,如遇到右括號‘(’,我們就將棧頂元素與該右括號比較,看他們是否匹配,若匹配,則讓棧頂元素出棧,若不匹配,則就輸出相應的提示資訊 void IsMatch(char* str)//判斷括號是否匹配,其實沒必要用老師的測試。 當然苦括號有大括號,中括號,小括號,但沒關係,這些,我的程式都可以檢測的出來。 void IsMatch(char* str)//判斷括號是否匹配,其實沒必要用老師的測試。 { assert(str); int len = strlen(str); Stack s; StackInit(&s); int size=0;//棧中有效元素的個數 int i = 0; char top = 0; int left = 0;//記錄字串中左括號的個數 int right = 0;//記錄字串中右括號的個數//")abcd]p"//"([]){}"; for (i = 0; i < len; i++)//執行完了之後再上去迴圈 { if (str[i] == '(' || str[i] == '{' || str[i] == '[') { StackPush(&s, str[i]); left++; } else//判斷括號是否匹配 { if (!StackEmpty(&s)) { top = StackTop(&s); if ((top == '(' && str[i] == ')') || (top == '{' && str[i] == '}') || top == '['&&str[i] == ']')//判斷棧頂元素與當前元素是否匹配 { StackPop(&s); } } } if (str[i] == ']' || str[i] == ')' || str[i] == '}') { right++; } } size = StackSize(&s); printf("%d\n", size); if (0 == size&&0==left&&0==right) { printf("您的輸入中不含有括號"); } if (0 == size&&left==right) { printf("該字串的左右括號匹配"); } if (size != 0&&left>right) { printf("首先該字串中的括號是不匹配的且該字串的左括號多於右括號"); } if (0 == size && left<right) { printf("首先該字串中的括號是不匹配的且該字串的右括號多於左括號"); } } 如果有不完善的,請大家多多指正。