用C语言实现“括号匹配“问题

简介: 用C语言实现“括号匹配“问题

题目介绍:

声明:题目来源于力扣.

题目链接:传送门

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。

示例

示例1:

输入:s = “()”
输出:true

例2:

输入:s = “()[]{}”
输出:true

示例3:

输入:s = “(]”
输出:false

解题思路:

此题我们使用’栈’这个结构.

每个左括号都与右边最近的右括号匹配。所以我们可以用栈来保存每个等待匹配的右括号的左括号是什么,只要匹配成功就把元素弹出,当字符串遍历结束时如果栈为空,就说明所有括号都互相匹配了。那么这个字符串就是有效的。

例如:

情况1:(右括号过多或者未匹配)

字符串没有遍历结束,而遇到右括号时,栈已经为NULL,则直接返回false.

当0 ,1 ,2入栈.

3与2匹配成功,则2出栈.

4与1匹配成功,则1出栈.

5与0匹配成功,0出栈.

此时6为右括号,在栈顶并没有等到他想要的人,因为栈已经为NULL了,则返回false.

a1a454fcaf814157a0a82f8fc510c943.png

情况2:

左字符串依次入栈,右字符串依次出栈,最后字符遍历结束,而栈也是空栈,则表示括号匹配成功.

当0 ,1 ,2 ,3入栈.

4与3匹配成功,则3出栈.

5与2匹配成功,则2出栈.

6与1匹配成功,则1出栈.

7与0匹配成功,则0出栈.

此时栈为NULL,且字符串遍历结束.返回true.

dced4424620648b6b4ba0ab56f1117a4.png

情况3:(左括号过多或者未匹配成功)


左括号过多,即使右括号用完(这个例子没用完),字符串遍历结束,栈中仍有元素(左括号未找到匹配).

栈非空返回false.

b39e1ca89ebd4469b00439ad92f481ef.png

骤:

C语言中使用栈的结构,需要自己造轮子,先设计一个栈出来,文章结尾已经写出,其次是一定要记得初始化(InitST).

  1. 计算字符串的长度
  2. 如果字符串是长度为奇数,则直接返回false.
  3. 遇见左括号入栈
  4. 遇见右括号先判断栈是否为NULL,为空则直接返回false.
    不为空,则与栈顶元素比较,如果是匹配成功的则出栈,否则直接返回false
  5. 最后如果栈是NULL栈则返回true,否则返回false

代码实现:

bool isValid(char* s) {
    ST st1;
  InitST(&st1);//这个别忘了
    int sz=strlen(s);
    if (sz % 2 == 1)
  {
    return false;
  }
    for(int i=0;i<sz;i++)
    {
        if(s[i]=='('||s[i]=='['||s[i]=='{')//左括号进栈
        {
            STPush(&st1,s[i]);
        }
        else//右括号
        {
            if(STEmpty(&st1))//如果碰到右括号,且栈是NULl,则返回false
            {
                return false;
            }
            //如果栈顶与右括号匹配,则出栈
            if (STTop(&st1) == '(' && s[i] == ')' || STTop(&st1) == '[' && s[i] == ']' || STTop(&st1) == '{' && s[i] == '}')//如果栈顶元素与右括号匹配,则出栈
      {
        STPop(&st1);
      }
           else{
               return false;
           }
        }
    }
    return STEmpty(&st1);
}

上面的实现方式还有一个内存泄漏的危险,因为栈空间并没有被释放,应当在每个返回结果之前调用栈销毁函数(STDestory).


栈的实现:

//栈的实现
//oj题里面不需要写头文件
typedef  char stacktype;
typedef struct stack
{
  stacktype* data;
  int top;
  int capacaity;
}ST;
void InitST(ST* ps);
void STPush(ST* ps, stacktype x);//压栈
void STPop(ST* ps);//出栈
bool STEmpty(ST* ps);//判断是否为空栈
stacktype STTop(ST* ps);//返回栈顶元素
void STDestory(ST* ps);//栈的销毁
//初始化栈
void InitST(ST* ps)
{
  assert(ps);
  ps->top = -1;
  ps->capacaity = 4;
  ps->data = (stacktype*)malloc(ps->capacaity * sizeof(stacktype));
}
//压栈
void STPush(ST* ps, stacktype x)
{
  assert(ps);
  if (ps->top + 1 == ps->capacaity)
  {
    ps->capacaity *= 2;
    stacktype* tmp = (stacktype*)realloc(ps->data, ps->capacaity * sizeof(stacktype));
    if (tmp == NULL)
    {
      printf("增容失败\n");
    }
    ps->data = tmp;
  }
  ps->top++;
  ps->data[ps->top] = x;
}
//出栈
void STPop(ST* ps)
{
  assert(ps);
  assert(!STEmpty(ps));
  ps->top--;
}
//判断是否为空栈,是空返回真
bool STEmpty(ST* ps)
{
  assert(ps);
  if (ps->top == -1)//如果"栈"为空,则栈顶的下标为-1;
  {
    return true;
  }
  return false;
}
//返回栈顶元素
stacktype STTop(ST* ps)
{
  assert(ps);
  return ps->data[ps->top];//反追栈顶元素
}
//栈的销毁
void STDestory(ST* ps)
{
  assert(ps);
  free(ps->data);//释放栈空间
  ps->data = NULL;
  ps->top = -1;
  ps->capacaity = 0;
}

提交记录:

6d63ad113895427882148f34bed6984e.png

目录
相关文章
|
7月前
|
C语言
C语言栈的括号匹配的检验讲解及相关代码
C语言栈的括号匹配的检验讲解及相关代码
157 0
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
477 8
|
7月前
|
C语言
【04】C语言括号匹配问题
【04】C语言括号匹配问题
|
缓存 C语言
【数据结构】C语言实现顺序栈 && OJ题 —— 有效的括号
【数据结构】C语言实现顺序栈 && OJ题 —— 有效的括号
138 0
【数据结构】C语言实现顺序栈 && OJ题 —— 有效的括号
|
C语言
C语言中使用大括号与给函数命名的正确方法(转载)
使用大括号的正确方法: 在C中,使用大括号的方法无所谓对还是错——只要每个开括号后都有一个闭括号,你的程序中就不再会出现与大括号有关的问题。
1682 0
|
18天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
39 10
|
18天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
42 9
|
18天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
31 8
|
18天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
40 6
|
18天前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
106 6