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