【数据结构OJ题】有效的括号

简介: 力扣题目——有效的括号

1. 题目描述

image.png

2. 思路分析

这道题目主要考查了的特性:

题目的意思主要是要做到3点匹配:类型、顺序、数量

题目给的例子是比较简单的情况,可能还有如下较为复杂的情况:
image.png

循环遍历字符串s中的字符,逐个取到每个括号,如果该括号是:
1. 左括号,入栈
2. 右括号,出栈顶括号,进行匹配。

如果不匹配,直接返回false。否则继续循环。

循环结束后,如果栈空则匹配,否则左括号比右括号多肯定不匹配

3. 代码实现

typedef char STDataType;
#define INIT_CAPACITY 4
typedef struct Stack
{
   
    STDataType* a;
    int top;  //栈顶
    int capacity;  //容量
}ST;

//初始化栈
void STInit(ST* ps);
//入栈
void STPush(ST* ps, STDataType x);
//出栈
void STPop(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空
bool STEmpty(ST* ps);
//销毁栈
void STDestroy(ST* ps);

void STInit(ST* ps)
{
   
    assert(ps);
    ps->a = NULL;
    ps->top = 0;
    ps->capacity = 0;
}

void STPush(ST* ps, STDataType x)
{
   
    assert(ps);
    if (ps->top == ps->capacity)
    {
   
        int newCapacity = ps->capacity == 0 ? INIT_CAPACITY : ps->capacity * 2;
        STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
        if (tmp == NULL)
        {
   
            perror("realloc failed");
            exit(-1);
        }
        ps->a = tmp;
        ps->capacity = newCapacity;
    }
    ps->a[ps->top] = x;
    ps->top++;
}

void STPop(ST* ps)
{
   
    assert(ps);
    //空
    assert(ps->a > 0);
    --ps->top;
}

STDataType STTop(ST* ps)
{
   
    assert(ps);
    //空
    assert(ps->a > 0);
    return ps->a[ps->top - 1];
}

int STSize(ST* ps)
{
   
    assert(ps);
    return ps->top;
}

bool STEmpty(ST* ps)
{
   
    assert(ps);
    return ps->top == 0;
}

void STDestroy(ST* ps)
{
   
    assert(ps);
    ps->a = NULL;
    ps->top = ps->capacity = 0;
}

bool isValid(char * s){
   
    ST st;
    STInit(&st);
    char topVal;
    while(*s)
    {
   
        if(*s=='('||*s=='{'||*s=='[')
        {
   
            STPush(&st,*s);
        }
        else
        {
   
            if(STEmpty(&st))
            {
   
                STDestroy(&st);
                return false;
            }
                        topVal=STTop(&st);
            if(*s==')'&&topVal!='('
                ||*s=='}'&&topVal!='{'
                ||*s==']'&&topVal!='[')
            {
   
                STDestroy(&st);
                return false;
            }
            else
            {
   
                STPop(&st);
            }
        }
        ++s;
    }
    bool ret=STEmpty(&st);
    STDestroy(&st);
    return ret;
}

image.png

相关文章
|
2月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
29 7
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
479 8
|
5月前
【数据结构OJ题】环形链表
力扣题目——环形链表
43 3
【数据结构OJ题】环形链表
|
5月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
38 1
【数据结构OJ题】设计循环队列
|
5月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
55 1
【数据结构OJ题】复制带随机指针的链表
|
5月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
36 1
【数据结构OJ题】环形链表II
|
5月前
【数据结构OJ题】相交链表
力扣题目——相交链表
37 1
【数据结构OJ题】相交链表
|
5月前
【数据结构OJ题】用栈实现队列
力扣题目——用栈实现队列
41 0
【数据结构OJ题】用栈实现队列
|
5月前
【数据结构OJ题】用队列实现栈
力扣题目——用队列实现栈
43 0
【数据结构OJ题】用队列实现栈
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
185 9