1. 程式人生 > 其它 >【資料結構】括號的匹配問題

【資料結構】括號的匹配問題

————搬磚: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左括號多餘");
    }

}