這裏使用鏈棧的方式實現。
//main.cpp #include <iostream> #include <malloc.h> #include <stdlib.h> #include "LinkStack.h" using namespace std; int main() { char arr[50]; int arrLength = sizeof(arr) / sizeof(char); int num = 0; cout << "您要輸入幾個字符?:"; cin >> num; cout << "\n\n請輸入英文括號字符:"; cin >> arr; cout << "\n\n當前輸入的字符爲:"; cout << arr; bool Match_Brackets(char exp[], int n); cout << "\n\n檢查括號是否匹配的情況:"; Match_Brackets(arr, num); system("pause"); cout << "\n"; return 0; } bool Match_Brackets(char exp[],int n) { LinkStack *LS; InitLinkStack(LS); char e; //存放元素的變量 bool match = true; //開始操作 for (int i = 0; i < n; i++) { //遍歷數組存放之前輸入的括號符號,將左括號放入棧中 if (exp[i] == '(' || exp[i] == '[') { LinkStack_Push(LS, exp[i]); } //如果 ) 右括號進來 else if (exp[i] == ')') { //取出上次棧頂元素進行匹配,e存放上次棧頂元素(即左括號) if (LinkStack_GetTop(LS, e) == true) { if (e != '(') { match = false; //如果上一個元素不是對應的左括號,則匹配失敗 } else { LinkStack_Pop(LS, e); //否則匹配成功,出棧 } } } //如果 ] 右括號進來 else if (exp[i] == ']') { if (LinkStack_GetTop(LS, e) == true) { //取出上次棧頂元素進行匹配,e存放上次棧頂元素(即左括號) if (e != '[') { match = false; //如果上一個元素不是對應的左括號,則匹配失敗 } else { LinkStack_Pop(LS, e); //否則匹配成功,出棧 } } } //取不到棧頂元素的情況 else { match = false; cout << "匹配失敗。\n\n"; } } //當棧不爲空的時候,則匹配失敗。即棧爲空時纔是所有括號匹配成功 if (!EmptyLinkStack(LS)) { match = false; cout << "匹配失敗。\n\n"; } else cout << "匹配成功。\n\n"; DestoryLinkStack(LS); return match; }
//LinkStack.h /* 鏈棧的實現 */ #include <iostream> using namespace std; typedef char LinkStack_ElemType; typedef struct LinkNode { LinkStack_ElemType data; struct LinkNode *next; }LinkStack; void InitLinkStack(LinkStack *&LS) { LS = (LinkStack *)malloc(sizeof(LinkStack)); LS->next = NULL; } void DestoryLinkStack(LinkStack *&LS) { LinkStack *pre = LS, *p = LS->next; while (p != NULL) { free(pre); pre = p; p = pre->next; } free(pre); } bool EmptyLinkStack(LinkStack *LS) { return (LS->next == NULL); } void LinkStack_Push(LinkStack *&LS, LinkStack_ElemType e) { LinkStack *p; p = (LinkStack *)malloc(sizeof(LinkStack)); p->data = e; p->next = LS->next; LS->next = p; } bool LinkStack_Pop(LinkStack *&LS, LinkStack_ElemType &e) { LinkStack *p; //頭節點指針 if (LS->next == NULL) { return false; } p = LS->next; //H指向首節點 e = p->data; //提取首節點的值 LS->next = p->next; //刪除首節點 free(p); return true; } bool LinkStack_GetTop(LinkStack *LS, LinkStack_ElemType &e) { if (LS->next == NULL) return false; e = LS->next->data; return true; }
運行截圖