思想:這道題是棧的應用類型,我們可以建立一個棧來保存'(','[','{',通過遍歷字符串如果是三個左括號其中一個則入棧,當遇到')'']''}'則出棧配對,如果左右匹配,則遍歷下一個元素,如果不匹配直接返回,如果遍歷字符串結束,但棧中還有元素,則是左符號單身,如果已經空棧,但是又遍歷到一個右括號,則是右括號單身
具體代碼:
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct LinkStack
{
char data;
struct LinkStack* next;
}LinkStack;
void InitStack(LinkStack** S)//初始化棧(不帶頭結點鏈表實現)
{
(*S) = NULL;
return;
}
bool Push(LinkStack** S,char ch)//入棧
{
if (ch == '(' || ch == '[' || ch == '{')
{
LinkStack* p = (LinkStack*)malloc(sizeof(LinkStack));
if (p == NULL)
return false;
//第一次入棧
if ((*S) == NULL)
{
p->data = ch;
p->next = NULL;
(*S) = p;
}
//后續入棧
else
{
p->data = ch;
p->next = (*S);
(*S) = p;
}
}
return true;
}
bool Pop(LinkStack** S)//出棧并且帶回元素
{
if ((*S) == NULL)//空棧無法出棧
return false;
LinkStack* p = (*S);
//*x = p->data;
(*S) = p->next;
free(p);
return true;
}
LinkStack* GetTop(LinkStack* S)//返回棧頂指針
{
if (S == NULL)//空棧
return NULL;
LinkStack* p = S;
return p;
}
bool EmptyStack(LinkStack* S)//判斷空棧
{
if (S == NULL)
return true;
return false;
}
void JudgeStack(LinkStack **S,char arr[])//判斷
{
char* a = arr;
while (*a != '\0')
{
if (*a == '(' || *a == '[' || *a == '{')//如果當時是三個括號其中一個則入棧
Push(S, *a);
else if (EmptyStack(*S) == false && *a == ')' && GetTop((*S))->data == '(')//如果是'('則出棧
Pop(S);
else if (EmptyStack(*S) == false && *a == ')' && GetTop((*S))->data != '(')//如果不是則直接退出
{
printf("配對失敗\n");
printf("%c %c\n",*a, GetTop((*S))->data);
return;
}
else if (EmptyStack(*S) == false && *a == ']' && GetTop((*S))->data == '[')//如果是'['則出棧
Pop(S);
else if (EmptyStack(*S) == false && *a == ']' && GetTop((*S))->data != '[')
{
printf("配對失敗\n");
printf("%c %c\n", *a, GetTop((*S))->data);
return;
}
else if (EmptyStack(*S) == false && *a == '}' && GetTop((*S))->data == '{')//如果是'{'則出棧
Pop(S);
else if (EmptyStack(*S) == false && *a == '}' && GetTop((*S))->data != '{')
{
printf("配對失敗\n");
printf("%c %c\n", *a, GetTop((*S))->data);
return;
}
else if (EmptyStack(*S) == true && (*a == ')' || *a == ']' || *a == '}'))//如果棧為空,且字符串中還有元素
printf("右括號單身\n");
a++;//向后遍歷字符串
?? ?}
if (EmptyStack(*S) == false)//如果字符串已遍歷結束但棧里還有元素
printf("左括號單身\n");
else
printf("配對成功\n");
return;
}
int main()
{
char arr[] = "[(3 + 2) * 5 + 3](]()";
LinkStack* S;//指向棧的指針
InitStack(&S);//初始化棧
JudgeStack(&S , arr);
return 0;
}
注:此代碼中運用了大量的if-else語句,不是很美觀(其實懶得改了),大家如果要引用可以自行優化代碼