棧的應用:括號匹配
阿新 • • 發佈:2020-12-29
文章目錄
棧的資料結構
typedef struct
{
int top;
char *data;
}SqStack;
棧初始化
void InitStack(SqStack *S)
{
S->top=-1;
S->data=new char[MaxSize-1];
for(int i=0;i<MaxSize-1;i++)
{
S->data[i]=-1;
}
}
判斷棧空
bool IsEmpty(SqStack S)
{
if(S.top==-1)
return true;
else
return false;
}
判斷棧滿
bool IsFull(SqStack S)
{
if(S.top==MaxSize-1)
return true;
else
return false;
}
獲取棧頂元素
char GetTopElem(SqStack S)
{
if(IsEmpty(S))
return NULL;
else
return S.data[S.top];
}
壓棧
bool PushStack(SqStack *S,char e)
{
if(IsFull(*S))return false;
S->top++;
S->data[S->top]=e;
return true;
}
退棧
bool PopStack(SqStack *S,char *e)
{
if(IsEmpty(*S))return false;
*e=S->data[S->top];
S->top--;
return true;
}
判斷元素是否在陣列中
bool IndexOf(char str[],char x)
{
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(str[i]==x)
return true;
}
return false;
}
左右括號匹配
char MathRightResponding(char x)
{
char result;
switch(x)
{
case '{':result='}';break;
case '[':result=']';break;
case '(':result=')';break;
default: result=' ';
}
return result;
}
括號匹配
bool IsMatchParen(char str[])
{
SqStack S;
InitStack(&S);
char leftParen[]="{[(";
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(IndexOf(leftParen,str[i]))
PushStack(&S,str[i]);
else{
if(!IsEmpty(S))
{
char top=GetTopElem(S);
char e;
if(MathRightResponding(top)==str[i])
PopStack(&S,&e);
else
return false;
}else
return false;
}
}
if(!IsEmpty(S))
return false;
return true;
}
測試資料
int main(int argc, char* argv[])
{
//匹配失敗有三種情況,左括號缺失,右括號缺失,左右括號不匹配
//左括號缺失
char str_leftmiss[]="{(())]}";
printf("輸入字串:%s\n",str_leftmiss);
bool result_leftmiss=IsMatchParen(str_leftmiss);
printf("括號匹配結果:%d\n",result_leftmiss);
//右括號缺失
char str_rightmiss[]="{(())[}";
printf("輸入字串:%s\n",str_rightmiss);
bool result_rightmiss=IsMatchParen(str_rightmiss);
printf("括號匹配結果:%d\n",result_rightmiss);
//左右括號不匹配
char str_miss[]="{(())[)}";
printf("輸入字串:%s\n",str_miss);
bool result_miss=IsMatchParen(str_miss);
printf("括號匹配結果:%d\n",result_miss);
//成功
char str_success[]="{(())[]}";
printf("輸入字串:%s\n",str_success);
bool result_success=IsMatchParen(str_success);
printf("括號匹配結果:%d\n",result_success);
return 0;
}
測試結果
輸入字串:{(())]}
括號匹配結果:0
輸入字串:{(())[}
括號匹配結果:0
輸入字串:{(())[)}
括號匹配結果:0
輸入字串:{(())[]}
括號匹配結果:1