c语言数据结构有效的括号


typedef char STDataType;
typedef struct Stack
{
    STDataType* a;     //栈中存储的是整形数据;
    int top;           //栈顶指针,指向栈顶元素,
    int capacity;
}ST;
void StackInit(ST* ps)
{
    assert(ps);
    ps->a = NULL;
    ps->top = 0//ps->top = -1;
    ps->capacity = 0;
}
void StackDestroy(ST* ps)
{
    assert(ps);
    free(ps->a);
    ps->a = NULL;
    ps->capacity = ps->top = 0;
}
void StackPush(ST* ps,STDataType x)//头插Push
{
    assert(ps);
    if(ps->top == ps->capacity)
    {
        int newCapacity = ps->capacity == 0?4:ps->capacity *2;
        STDataType* tmp = realloc(ps->a,sizeof(STDataType)*newCapacity);
        //对已有的空间进行扩容,
        if(tmp == NULL)
        {
            printf("realloc fall\n");
            exit(-1);
        }
        ps->a = tmp;
        ps->capacity = newCapacity;
    }
    ps->a[ps->top] = x;
    ps->top++;
}
void StackPop(ST* ps)//头删;
{
    assert(ps);
    assert(ps->top > 0);//top指向的是下一个,所以,top=0的时候,其实是-1在处,并无数据,等待头插
    ps->top--;
}
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 StackEmpty(ST* ps)//空
{
    assert(ps);
    
    if(ps->top > 0)
    {
        return true;
    }
    else{
        return false;
    }
    //return ps->top == 0;   ??
}
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps,STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);
bool isValid(char * s){
    ST st;
    StackInit(&st);   //初始化后,记得销毁??
    while(*s)         
    {   //左括号入栈,右括号出栈,
        if(*s == '(' || 
           *s == '[' ||      //左括号入栈,右括号出栈
           *s == '{'    )        
        {
            StackPush(&st,*s);
            ++s;     //????
        }    
        else
        {
            //遇到右括号了
            if(StackEmpty(&st))
            {
                return false;
            }
            STDataType top = StackTop(&st);
            StackPop(&st);  
         if( (*s == '}' &&top != '{')
            || (*s == ')' &&top != '(')
            || (*s == ']' &&top != '[') )//收括号
            {
                StackDestroy(&st);
                return false;
            }
            else
            {
                ++s;
            }
        }
    }
    bool ret = StackEmpty(&st);
    StackDestroy(&st);
    return ret;
}

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

第一个while中,s自加,s在这里不是地址嘛,他可以自加嘛

基于Monster 组和GPT的调写:

  • 在这段代码中,s 是一个指向字符串的指针,通过 *s 可以访问指针所指向的字符。因此,在第一个 while 循环中,通过 ++s 可以将指针 s 向后移动,指向下一个字符。
  • 这种方式常用于遍历字符串,通过不断向后移动指针,逐个处理字符串中的字符。在这段代码中,通过 *s 判断字符是否为左括号或右括号,并根据判断结果进行相应的操作。然后使用 ++s 将指针 s 向后移动,继续处理下一个字符,直到遍历完整个字符串。