LeetCode20.有效的括号——纯C

简介: LeetCode20.有效的括号——纯C

“寻寻觅觅冷冷清清凄凄惨惨戚戚”

“三杯两盏淡酒,怎敌他晚来风急”


这道题是括号匹配问题,典型对 栈的应用的题目。

如何创建一个顺序栈在前面的博文已经实现:传送门


题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。


题目链接

LeetCode20. 有效的括号.简单

题目分析

括号匹配问题,典型的对数据结构 栈的应用。

以我现在初学数据结构的水平,LeetCode虽然表明它是个简单题,但对我来说并不简单,知识储备量不够多,用纯C解决的话,很繁琐。

我的思路是先需要创建一个顺序结构的栈,然后用栈的基本功能如:压栈(StackPush),出栈(StackPop),得到栈顶的元素(StackTop)等功能 来完成这道题。


思路:

1.遍历整个字符串“ ‘(’,’)’,’{’,’}’,’[’,’]’ ”。

2.在遍历的过程中如果遇到左括号’(’,或者’{’,或者’[’。进行压栈操作(StackPush)。

3.如果遇到右括号’)’,或者’}’,或者’]’,则进行访问栈顶元素的值的操作(StackTop),如果栈顶的左括号和其中之一的右括号匹配,则进行出栈操作(StackPop)。

4.直到字符串越界循环结束。



代码实现

注意:在实现的过程中,需要注意极端情况。

普通情况正常人都能想到。而极端情况就不一定了。

而且题目的实例中可没有给哦。

1.假如只有一个左括号‘(’呢?

//提示:只有一个左括号时,栈就不为空了。

2.假如只有一个右括号‘)’呢?

//提示:只有一个右括号时栈为空。

/***********
*结构体创建
***********/
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);
//判断栈是否为空
bool StackEmpty(ST* ps);
//得到栈的长度
int StackSize(ST* ps);
/***********
*函数的定义
***********/
//初始化结构体
void StackInit(ST* ps)
{
  assert(ps);
  ps->a = NULL;
  ps->capacity = 0;
  ps->top = 0;
}
//销毁结构体
void StackDestroy(ST* ps)
{
  assert(ps);
  free(ps->a);
  ps->a = NULL;
  ps->capacity = 0;
  ps->top = 0;
}
//压栈
void StackPush(ST* ps, STDataType x)
{
  assert(ps);
  if (ps->top == ps->capacity)
  {
    int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    STDataType* new = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
    if (new == NULL)
    {
      printf("realloc fail\n");
      exit(-1);
    }
    ps->a = new;
    ps->capacity = newcapacity;
  }
  ps->a[ps->top] = x;
  ps->top++;
}
//出栈
void StackPop(ST* ps)
{
  assert(ps);
  assert(ps->top > 0);
  ps->top--;
}
//访问栈顶元素
STDataType StackTop(ST* ps)
{
  assert(ps);
  assert(ps->top > 0);
  return ps->a[ps->top - 1];
}
//判断栈是否为空
bool StackEmpty(ST* ps)
{
  assert(ps);
  return ps->top == 0;
}
//得到栈的长度
int StackSize(ST* ps)
{
  assert(ps);
  return ps->top;
}
/***********
*题目函数接口
***********/
bool isValid(char* s)
{
  ST st;
  //创建栈,否则后续压栈等操作无法实现
  StackInit(&st);
  while (*s)
  {
    if (*s == '(' || *s == '{' || *s == '[')
    {
      StackPush(&st, *s);
      s++;
    }
    else
    {
    //只有一个右括号时,栈为空。直接return false
      if (StackEmpty(&st))
      {
        return false;
      }
      char top = StackTop(&st);
      if (*s == ')' && top == '(' || *s == '}' && top == '{' || *s == ']' && top == '[')
      {
        StackPop(&st);
        s++;
      }
      else
      {
        return false;
      }
    }
  }
  //处理只有一个左括号
  if (!StackEmpty(&st))
  {
    return false;
  }
  return true;
  //销毁栈,拒绝内存泄漏
  StackDestroy(&st);
}
相关文章
|
7月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
21 0
Leetcode第二十二题(括号生成)
|
2月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
19 0
|
4月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
4月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
4月前
|
算法 Python
【Leetcode刷题Python】括号匹配问题
一种解决括号匹配问题的Python实现方法,通过计算给定括号串的所有子串的最长合法括号子序列长度之和来确定权值。
28 0
|
4月前
|
机器学习/深度学习 Python
【Leetcode刷题Python】22. 括号生成
本文介绍了了LeetCode题目22的两种Python编程解决方案,题目要求生成所有可能的且有效的括号组合,包括暴力求解和回溯方法。
27 0
|
4月前
|
Python
【Leetcode刷题Python】20. 有效的括号
LeetCode上题目“20. 有效的括号”的Python解决方案,使用栈数据结构来验证括号序列的有效性。具体实现中,会在栈中预先放置一个特殊字符以避免在弹出操作时出现空栈错误,并通过匹配左右括号来判断括号序列是否有效。
46 0
|
6月前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
48 1