《手撕数据结构经典题系列》有效括号问题

简介: 力扣链接:20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)

有效括号


力扣链接:20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)


题目描述:


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


有效字符串需满足:


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

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


  • 示例:


43.png

提示:


  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成


  • 解题思路:


  1. 这里我们使用栈来解决(先入后出的性质 )
  2. 在k题时首先得写个栈出来
  3. 读取字符时如果遇到左括号则进行入栈操作
  4. 如果遇到右括号则进行出栈操作,并对出栈数据与读取数据进行匹配
  5. 当匹配成功时,则继续读取字符
  6. 当读取结束并且栈中没有数据则为有效字符串,否则相反


图示:

44.png


参考代码:


bool isValid(char * s){
    //开辟栈
    ST st;
    StackInit(&st);
    char* str=s;
    while(*str!='\0')
    {
        //遇到左括号入栈
        if(*str=='('
        ||*str=='{'
        ||*str=='[')
        {
            StackPush(&st,*str);
            str++;
        }
        else
        {
            //遇到右括号出栈匹配
            if(*str=='}'
            ||*str==']'
            ||*str==')')
            {
                //为空栈时
                if(StackEmpty(&st))
                {
                    StackDestroy(&st);//注意栈空间销毁(养成好的习惯)
                    return false;
                }
                else
                {
                    char tmp=StackTop(&st);//获取栈顶数据
                    StackPop(&st);//出栈
                    if((*str==']'&&tmp!='[')
                    ||(*str=='}'&&tmp!='{')
                    ||(*str==')'&&tmp!='('))
                    {
                        //匹配失败
                        StackDestroy(&st);
                        return false;
                    }
                    else
                        str++;
                }
            }
        }  
    }
    //遍历完时栈还有数据为被出栈
    if(StackEmpty(&st))
    {
        StackDestroy(&st);//结束前先销毁栈
        return true;
    }
    else
    {
        StackDestroy(&st);
        return false;
    }
}


附上栈源码:


//默认栈数据类型
typedef char STDataType;
//栈类型结构
typedef struct Stack
{
  //数组栈(指向数组的指针)
  STDataType* a;
  //栈顶位置
  int top;
  //栈容量
  int capacity;
}ST;
//栈初始化
void StackInit(ST* ps);
//栈销毁
void StackDestroy(ST* ps);
//入栈
void StackPush(ST* ps, STDataType x);
//出栈
void StackPop(ST* ps);
//获取栈顶数据
STDataType StackTop(ST* ps);
//栈使用空间大小
int StackSize(ST* ps);
//是否为空栈
bool StackEmpty(ST* ps);
//栈初始化
void StackInit(ST* ps)
{
  //避免传入空指针
  assert(ps);
  ps->a = NULL;
  ps->top = 0;//定义top为栈最后数据的后一个位置
  //也可以选择让top为当前最后数据的位置 此时初始化top=-1;
  ps->capacity = 0;
  return;
}
//栈销毁
void StackDestroy(ST* ps)
{
  //避免传入空指针
  assert(ps);
  free(ps->a);//释放开辟的数组栈空间
  ps->a = NULL;//置空,避免造成野指针
}
//入栈
void StackPush(ST* ps, STDataType x)
{
  assert(ps);
  if (ps->top == ps->capacity)//栈满的情况
  {
    //如果原来容量为0则让新容量为4,否则为两倍
    int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    //调整数组栈大小(特别的:当数组指针为NULL时,realloc的作用和malloc的作用一样)
    STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(ST) * newcapacity);
    if (tmp == NULL)//tmp为NULL时则表示调整数组空间失败,那么就打印错误并结束进程
    {
      perror("realloc fail:");
      exit(-1);
    }
    ps->a = tmp;
    ps->capacity = newcapacity;
  }
  ps->a[ps->top] = x;//存入数据
  ps->top++;//top位置更新
  return;
}
//出栈
void StackPop(ST* ps)
{
  //避免传入空指针
  assert(ps);
  //出栈到数据个数为0结束
  if (StackEmpty(ps))
    return;
  ps->top--;//让top减减得到出栈的效果
  return;
}
//获取栈顶数据
STDataType StackTop(ST* ps)
{
  //避免传入空指针
  assert(ps);
  //为空栈时无栈顶数据
  assert(!StackEmpty(ps));
  return ps->a[ps->top-1];//此时top-1才表示栈顶数据的下标
}
//栈使用空间大小
int StackSize(ST* ps)
{
  //避免传入空指针
  assert(ps);
  return ps->top;
}
//是否为空栈
bool StackEmpty(ST* ps)
{
  //避免传入空指针
  assert(ps);
  return ps->top == 0;
}


每日k题无烦恼,点赞学习不得了~

相关文章
代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值
代码随想录Day9 栈与队列 LeetCodeT20 有效的括号 T1047 删除字符串中所有相邻重复项 T150 逆波兰表达式求值
30 0
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
402 8
|
4月前
【数据结构OJ题】有效的括号
力扣题目——有效的括号
37 1
【数据结构OJ题】有效的括号
|
5月前
|
算法 C语言 计算机视觉
【数据结构与算法 经典例题】括号匹配问题
【数据结构与算法 经典例题】括号匹配问题
|
5月前
|
C++
【洛谷 P1739】表达式括号匹配 题解(栈)
该编程题目要求检查给定的包含字母、运算符和括号的表达式是否括号匹配。输入为一行表达式,以`@`结束。如果括号匹配,输出`YES`,否则输出`NO`。样例包括一个匹配和一个不匹配的表达式。解决方案是使用栈,遇到左括号入栈,遇到右括号时判断栈是否为空,栈空则输出`NO`,否则出栈。当读到`@`时,栈空则输出`YES`,否则输出`NO`。提供的AC代码使用C++实现,通过`stack`处理括号匹配。
76 0
|
5月前
|
算法 C语言
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
数据结构和算法学习记录——特殊线性表之栈(下)-销毁栈函数、判断栈是否为空、压栈函数、出栈函数、取栈顶元素、计算栈中有多少个元素、栈有关习题-有效的括号
36 0
|
6月前
栈刷题记(一-有效的括号)
栈刷题记(一-有效的括号)
栈刷题记(一-有效的括号)
|
6月前
|
缓存 算法 C语言
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
30 0
|
6月前
|
算法 安全 Java
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
43 0
数据结构实验之栈与队列四:括号匹配
数据结构实验之栈与队列四:括号匹配