【数据结构与算法 经典例题】括号匹配问题

简介: 【数据结构与算法 经典例题】括号匹配问题

一、问题描述

原题来自

20. 有效的括号 - 力扣(LeetCode)

二、解题思路

🍃破解之道

括号匹配问题是一个比较有实际意义的问题,

问题要求将三种类型括号匹配,其中包括顺序匹配和数量匹配

使用栈的后进先出结构可以很好的解决这个问题:

遍历字符串
遇到左括号则压栈等待右括号匹配;
遇到右括号先进行判断,首先判断栈是否为空,如果为空则不可能完成匹配,直接判定无效

上述判定不成立再进行下列判断
如果此时栈顶的数据是与右括号匹配的左括号,则出栈,否则直接判定无效(顺序不匹配)
当字符串遍历完成时,如果栈为空,则说明括号全部匹配上了;否则说明数量不匹配

关于栈的问题可以阅读前置文章

【数据结构/C语言】使用数组实现栈:原理、步骤与应用-CSDN博客

🍃画图举例说明:

第一种情况:数量顺序完全匹配时

第二种情况:数量匹配,顺序不匹配时

第三种情况:数量不匹配时

三、C语言实现代码

C语言需要自己实现栈的数据结构,轮子之前已经造好了,这里就直接CV拿过来了

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
 
// 支持动态增长的栈
typedef char STDataType;//对数据类型重命名,方便后期修改类型
typedef struct Stack
{
  STDataType* a;
  int top;    // 栈顶
  int capacity;  // 容量 
}Stack;//定义结构同时重命名
 
// 初始化栈 
void StackInit(Stack* ps)
{
  assert(ps);
  ps->a = NULL;
  ps->top = ps->capacity = 0;
}
 
// 入栈 
void StackPush(Stack* ps, STDataType data)
{
  assert(ps);
  //判断是否需要扩容
  if (ps->top == ps->capacity)
  {
    int newcapa = ps->capacity == 0 ? 4 : 2 * (ps->capacity);
    STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapa);
    if (tmp == NULL)
    {
      perror("realloc\n");
      exit(1);
    }
    ps->a = tmp;
    ps->capacity = newcapa;
  }
  //确定空间足够之后再插入数据
  ps->a[ps->top] = data;
  ps->top++;
}
 
// 出栈 
void StackPop(Stack* ps)
{
  assert(ps);
  assert(ps->top);
 
  ps->top--;
}
 
// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
  assert(ps);
  assert(ps->top);
  return ps->a[ps->top-1];
}
 
// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{
  assert(ps);
 
  return ps->top;
}
 
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
  assert(ps);
 
  return ps->top == 0;
}
 
// 销毁栈 
void StackDestroy(Stack* ps)
{
  assert(ps);
  free(ps->a);
  ps->a = NULL;
  ps->top = ps->capacity = 0;
}
 
//括号匹配问题
bool isValid(char* s)
{
  Stack st;
  StackInit(&st);//创建一个栈的结构体变量
  char* p = s;
  while (*p)
  {
    if (*p == '(' || *p == '[' || *p == '{')//左括号入栈
    {
      StackPush(&st,*p);
    }
    if (*p == ')' || *p == ']' || *p == '}')//右括号进行判断
    {
      if (StackEmpty(&st))//此时栈空,可直接判定false
      {
        StackDestroy(&st);
        return false;
      }
      else
      {
        char tmp = StackTop(&st);
        StackPop(&st);//栈顶元素出栈
        if ((*p == ')' && tmp != '(' )//判断顺序是否匹配
          || (*p == ']' && tmp != '[' )
          || (*p == '}' && tmp != '{'))
          return false;
      }
    }
    p++;
  }
  if (StackEmpty(&st))//判断数量是否匹配
    return true;
  else
    return false;
}

 

相关文章
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
479 8
|
5月前
【数据结构OJ题】有效的括号
力扣题目——有效的括号
39 1
【数据结构OJ题】有效的括号
|
4月前
|
算法 C++
第一周算法设计与分析 H : 括号匹配
这篇文章介绍了解决算法问题"括号匹配"的方法,通过使用栈来检查给定字符串中的括号是否合法匹配,并提供了相应的C++代码实现。
|
6月前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
6月前
|
算法
【数据结构与算法 经典例题】随机链表的复制(图文详解)
【数据结构与算法 经典例题】随机链表的复制(图文详解)
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
186 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
32 1
下一篇
DataWorks