【数据结构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

相关文章
|
12天前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
21 7
|
1月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
221 8
|
3月前
【数据结构OJ题】环形链表
力扣题目——环形链表
36 3
【数据结构OJ题】环形链表
|
3月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
30 1
【数据结构OJ题】设计循环队列
|
3月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
50 1
【数据结构OJ题】复制带随机指针的链表
|
3月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
28 1
【数据结构OJ题】环形链表II
|
3月前
【数据结构OJ题】相交链表
力扣题目——相交链表
31 1
【数据结构OJ题】相交链表
|
3月前
【数据结构OJ题】用栈实现队列
力扣题目——用栈实现队列
36 0
【数据结构OJ题】用栈实现队列
|
3月前
【数据结构OJ题】用队列实现栈
力扣题目——用队列实现栈
37 0
【数据结构OJ题】用队列实现栈
|
11天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
16 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器