1. 程式人生 > 其它 >棧的應用:括號匹配

棧的應用:括號匹配

技術標籤:資料結構資料結構

文章目錄

棧的資料結構

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