【資料結構】括號的匹配問題
阿新 • • 發佈:2021-10-16
————搬磚:https://blog.csdn.net/qq_36805270/article/details/89979173
括號匹配問題是棧應用的一個經典場景,原理比較簡單:
括號匹配原理
假設表示式中允許包含兩種括號:圓括號和方括號,其嵌入的順序隨意,即([ ] ( ))或[([ ] [ ])]等為正確的格式,[(])或([())或(())]均為不正確的格式。檢驗括號是否匹配的方法可用“期待的急迫程度”這個概念來描述。
在這裡插入圖片描述
由此,在演算法中設定一個棧,每讀入一個括號,若是右括號,則或者使置於棧頂的最擊破的期待得以消解,或者是不合法的情況;若是左括號,則作為一個新的更急迫的期待壓入棧中,自然使原有的在棧中的所有未消解的期待的急迫性都降了一級。另外,在演算法的開始和結束時,棧都應該是空的。
不過多搬了 這個直接上程式碼
#include <stdio.h> #include <stdlib.h> #include "Stact.h" //自定義標頭檔案 記憶體儲棧的基本操作 char /*---括號匹配問題---*/ int main(){ char ch[STACK_INIT_SIZE ]; scanf("%s",ch); BracketMatch(ch); } int Match(char a,char b) { if((a=='[' && b==']')||(a=='(' && b==')')||(a=='{' && b=='}')) return 1; else return 0; } void BracketMatch(char *str) { char ch; SeqStack *s; int i; s = (SeqStack*)malloc(sizeof(SeqStack)); InitStack(s); for(i = 0;str[i]!='\0';i++) { switch(str[i]) { case '(': push(s,str[i]);break; case '[': push(s,str[i]);break; case '{': push(s,str[i]);break; case ')':{ if(IsEmpty(s)) { printf("\n左括號多餘");return; } else { getTop(s,&ch); if(Match(ch,str[i])) { Pop(s,&ch); } else { printf("\n對應左右括號不同類"); } } };break; case ']': { if(IsEmpty(s)) { printf("\n左括號多餘");return; } else { getTop(s,&ch); if(Match(ch,str[i])) { Pop(s,&ch); } else { printf("\n對應左右括號不同類"); } } };break; case '}':{ if(IsEmpty(s)) { printf("\n左括號多餘");return; } else { getTop(s,&ch); if(Match(ch,str[i])) { Pop(s,&ch); } else { printf("\n對應左右括號不同類"); } } };break; } } if(IsEmpty(s)) { printf("\n括號匹配"); }else { printf("\n左括號多餘"); } }