Leetcode20.有效的括号

简介: Leetcode20.有效的括号

题目描述

题目来源:Leetcode20.有效的括号

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

有效字符串需满足:

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

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

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

解题思路:

该题是栈的典型应用,满足后进先出的规则(后入栈的前括号将优先与先出现的后括号相匹配)。

 遍历字符串,遇到前括号直接入栈。遇到后括号,判断该后括号与栈顶的前括号是否匹配(若此时栈为空,则字符串无效),若不匹配则字符串无效;若匹配则删除栈顶元素,继续遍历字符串,直到字符串遍历完毕。当字符串遍历完后,检测栈是否为空,若为空,则字符串有效,若不为空,说明有前括号未匹配,字符串无效。

代码解决:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
//链接:
//https ://leetcode.cn/problems/valid-parentheses/
typedef char STDataType;//栈中存储的元素类型
typedef struct Stack
{
  STDataType* a;//栈
  int top;//栈顶
  int capacity;//容量,方便增容
}Stack;
//初始化栈
void StackInit(Stack* pst)
{
  assert(pst);
  pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);//初始化栈可存储4个元素
  pst->top = 0;//初始时栈中无元素,栈顶为0
  pst->capacity = 4;//容量为4
}
//销毁栈
void StackDestroy(Stack* pst)
{
  assert(pst);
  free(pst->a);//释放栈
  pst->a = NULL;//及时置空
  pst->top = 0;//栈顶置0
  pst->capacity = 0;//容量置0
}
//入栈
void StackPush(Stack* pst, STDataType x)
{
  assert(pst);
  if (pst->top == pst->capacity)//栈已满,需扩容
  {
    STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * pst->capacity * 2);
    if (tmp == NULL)
    {
      printf("realloc fail\n");
      exit(-1);
    }
    pst->a = tmp;
    pst->capacity *= 2;//栈容量扩大为原来的两倍
  }
  pst->a[pst->top] = x;//栈顶位置存放元素x
  pst->top++;//栈顶上移
}
//检测栈是否为空
bool StackEmpty(Stack* pst)
{
  assert(pst);
  return pst->top == 0;
}
//出栈
void StackPop(Stack* pst)
{
  assert(pst);
  assert(!StackEmpty(pst));//检测栈是否为空
  pst->top--;//栈顶下移
}
//获取栈顶元素
STDataType StackTop(Stack* pst)
{
  assert(pst);
  assert(!StackEmpty(pst));//检测栈是否为空
  return pst->a[pst->top - 1];//返回栈顶元素
}
//获取栈中有效元素个数
int StackSize(Stack* pst)
{
  assert(pst);
  return pst->top;//top的值便是栈中有效元素的个数
}
/*---以上代码是栈的基本功能实现,以下代码是题解主体部分---*/
bool isValid(char* s)
{
  Stack st;//创建一个栈
  StackInit(&st);//初始化栈
  char* cur = s;
  while (*cur)
  {
    //前括号统一进栈
    if (*cur == '(' || *cur == '[' || *cur == '{')
    {
      StackPush(&st, *cur);
      cur++;
    }
    else
    {
      //若遇到后括号,且栈为空,则字符串无效
      if (StackEmpty(&st))
      {
        StackDestroy(&st);
        return false;
      }
      //获取栈顶元素
      char top = StackTop(&st);
      //后括号与栈顶的前括号不匹配
      if (top == '(' && *cur != ')' || top == '{' && *cur != '}' || top == '[' && *cur != ']')
      {
        StackDestroy(&st);
        return false;
      }
      //匹配
      else
      {
        StackTop(&st);
        cur++;
      }
    }
  }
  //检测栈是否为空
  bool ret = StackEmpty(&st);
  StackDestroy(&st);
  //返回结果
  return ret;
}

结果与总结:

通过所有示例,问题得到解决。

相关文章
|
6月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
4天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
13 0
Leetcode第二十二题(括号生成)
|
1月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
16 0
|
3月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
3月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
3月前
|
算法 Python
【Leetcode刷题Python】括号匹配问题
一种解决括号匹配问题的Python实现方法,通过计算给定括号串的所有子串的最长合法括号子序列长度之和来确定权值。
23 0
|
3月前
|
机器学习/深度学习 Python
【Leetcode刷题Python】22. 括号生成
本文介绍了了LeetCode题目22的两种Python编程解决方案,题目要求生成所有可能的且有效的括号组合,包括暴力求解和回溯方法。
23 0
|
3月前
|
Python
【Leetcode刷题Python】20. 有效的括号
LeetCode上题目“20. 有效的括号”的Python解决方案,使用栈数据结构来验证括号序列的有效性。具体实现中,会在栈中预先放置一个特殊字符以避免在弹出操作时出现空栈错误,并通过匹配左右括号来判断括号序列是否有效。
42 0
|
5月前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
40 1