重学数据结构:栈的应用-括号匹配(C语言)

博客围绕栈的数据结构展开,介绍了栈的初始化、判断栈空和栈满、获取栈顶元素、压栈、退栈等操作,还涉及判断元素是否在数组中、左右括号匹配及括号匹配的内容,并给出了测试数据和结果。

栈的数据结构

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值