Leetcode刷题之有效的括号(C语言版)

一、题目描述

20、有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

①、左括号必须用相同类型的右括号闭合。
②、左括号必须以正确的顺序闭合。
③、每个右括号都有一个对应的相同类型的左括号。

二、题目测试用例

在这里插入图片描述

三、题目分析

本题是要将左括号与右括号相匹配的进行闭合,所以我们想到采用“栈”的先进后出特性来进行数据的存放操作。所以我们先要写一个栈出来,包括栈的创建,栈的销毁等许多的基础操作。如果大家忘记了栈的相关操作如何去写,可以看我之前的文章《数据结构——栈的详细介绍》。写好栈之后,我们对于本道题的解题思路便是:
①、左括号入栈

 if(*s=='('
      ||*s=='{'
      ||*s=='[')
      {
        PushST(&st,*s);
      }

②、右括号出栈顶元素与其进行比较
这里需要注意的是如果当前只有一个任意的右括号,那么就没有可能出栈与其进行匹配操作,所以在此要对栈进行判空,保证当前栈内存在元素。如果当前栈内没有元素,便要对栈进行销毁操作,以防止内存的泄漏。

 else
      {
          //判断栈当前是否为空
          if(STEmpty(&st))
          {
            
            //注意在此需要防止内存泄漏
            //销毁栈
            DestoryST(&st);
              return false;
          }
          //判断匹配问题
          char top=TopST(&st);
          //对栈顶元素进行出栈,更新栈顶元素
          PopST(&st);
          if((*s==']'&&top!='[')
          ||(*s=='}'&&top!='{')
          ||(*s==')'&&top!='('))
          {
            //注意在此需要防止内存泄漏
            //销毁栈
            DestoryST(&st);
              return false;
          }
      }

③、返回值

 bool ret=STEmpty(&st);

查看当前栈内是否还存在其他的元素,如果没有则返回true,否则返回false

四、完整代码

//定义数据类型
typedef char STDatatype;


typedef struct STack
{
	STDatatype* a;//数组
	int capacity;//容量
	int top;//栈顶元素的下一个
}ST;



//初始化
void InitST(ST* pst);
//销毁
void DestoryST(ST* pst);
//压栈
void PushST(ST* pst, STDatatype x);
//出栈
void PopST(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取栈顶元素
STDatatype TopST(ST* pst);
//获取栈的size
int STSize(ST* pst);
//初始化
void InitST(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;//栈顶元素的下一个位置
	pst->top = 0;
}
//销毁
void DestoryST(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;
}
//压栈
void PushST(ST* pst, STDatatype x)
{
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDatatype *tmp = (STDatatype*)realloc(pst->a, sizeof(STDatatype) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	//插入数据
	pst->a[pst->top] = x;
	pst->top++;
}
//出栈
void PopST(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	pst->top--;
}
//判空
bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}
//获取栈顶元素
STDatatype TopST(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	return pst->a[pst->top-1];
}
//获取栈的size
int STSize(ST* pst)
{
	assert(pst);
	return pst->top;
}
bool isValid(char* s) 
{
    ST st;
    //初始化
    InitST(&st);
    //解题思路:①左括号入栈  ②右括号出栈
    while(*s)
    {
      if(*s=='('
      ||*s=='{'
      ||*s=='[')
      {
        PushST(&st,*s);
      }

      else
      {
          //判断栈当前是否为空
          if(STEmpty(&st))
          {
            
            //注意在此需要防止内存泄漏
            //销毁栈
            DestoryST(&st);
              return false;
          }
          //判断匹配问题
          char top=TopST(&st);
          //对栈顶元素进行出栈,更新栈顶元素
          PopST(&st);
          if((*s==']'&&top!='[')
          ||(*s=='}'&&top!='{')
          ||(*s==')'&&top!='('))
          {
            //注意在此需要防止内存泄漏
            //销毁栈
            DestoryST(&st);
              return false;
          }
      }
      ++s;
    }
    bool ret=STEmpty(&st);

    //销毁栈
    DestoryST(&st);

    return ret;
}

在这里插入图片描述

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

{Hello World}

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值