有效的括号.leetcode20 《数据结构入门到精通N8》

简介: 有效的括号.leetcode20 《数据结构入门到精通N8》

题目链接


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


题目描述


image.png

image.png

image.png



思路


用栈来解决这个问题。当为左括号时,入栈,为右括号时出栈,同时注意括号的个数是否匹配,如左括号多余右括号,或者右括号多余左括号的情况。(注意因为是用c语言来实现,所以我们还要单独来实现一个栈)



代码


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
//struct Stack
//{
//  int a[N];
//  int top; // 栈顶的位置
//};
typedef int STDataType;
typedef struct Stack
{
  STDataType* a;
  int top;    // 栈顶的位置
  int capacity; // 容量
}ST;
void StackInit(ST* ps);
void StackDestory(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
bool StackEmpty(ST* ps);
int StackSize(ST* ps);
STDataType StackTop(ST* ps);
void StackInit(ST* ps)
{
  assert(ps);
  ps->a = NULL;
  ps->top = 0;
  ps->capacity = 0;
}
void StackDestory(ST* ps)
{
  assert(ps);
  free(ps->a);
  ps->a = NULL;
  ps->capacity = 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;
    ps->a = (STDataType*)realloc(ps->a, newCapacity* sizeof(STDataType));
    if (ps->a == NULL)
    {
      printf("realloc fail\n");
      exit(-1);
    }
    ps->capacity = newCapacity;
  }
  ps->a[ps->top] = x;
  ps->top++;
}
void StackPop(ST* ps)
{
  assert(ps);
  assert(ps->top > 0);
  --ps->top;
}
bool StackEmpty(ST* ps)
{
  assert(ps);
  /*if (ps->top > 0)
  {
    return false;
  }
  else
  {
    return true;
  }*/
  return ps->top == 0;
}
STDataType StackTop(ST* ps)
{
  assert(ps);
  assert(ps->top > 0);
  return ps->a[ps->top - 1];
}
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
            //如: ()) 
            if(StackEmpty(&st))
            return false;
            //取栈顶
            char top=StackTop(&st);
            StackPop(&st);
            //因为继续的条件有很多,所以我们判断return的条件
            //这里很值得注意
            if((*s==')' && top!='(')
            ||(*s==']' && top!='[')
            ||(*s=='}' && top!='{'))
            {
                StackDestory(&st);
                return false;
            }
            s++;
        }
    }
    //如果栈此时不等于空,就说明左括号有多余的
    if(!StackEmpty(&st))
    {
        StackDestory(&st);
        return false;
    }
    //此时栈为空,说明前面的左右括号都匹配了
    else
    {
        StackDestory(&st);
        return true;
    }
}

最后的最后,创作不易,希望读者三连支持💖

赠人玫瑰,手有余香💖

相关文章
|
2月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
3月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
22 0
Leetcode第二十二题(括号生成)
|
3月前
|
存储 机器学习/深度学习 算法
探索数据结构:入门及复杂度的解锁
探索数据结构:入门及复杂度的解锁
|
3月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
101 0
|
3月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
33 0
|
3月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
61 0
|
3月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
23 0
|
4月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
487 8
|
3月前
|
存储 缓存 应用服务中间件
Nginx入门 -- 基本数据结构中之ngx_hash_t
Nginx入门 -- 基本数据结构中之ngx_hash_t
43 0
|
3月前
|
存储 缓存 应用服务中间件
Nginx入门 -- 基本数据结构中之ngx_list_t,ngx_queue_t
Nginx入门 -- 基本数据结构中之ngx_list_t,ngx_queue_t
40 0