刷爆leetcode第六期 0017

简介: 刷爆leetcode第六期 0017

编号0017


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


有效字符串需满足:


左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/valid-parentheses


我们假设字符串有这些符号组成


54ebb6d050394d12bcd36f2c33ee55b6.png


当我们遍历到左括号的时候 我们就对其进行压栈操作


c语言代码表示如下


typedef char StackType;
typedef struct Stack
{
  StackType* a;  //储存数据的大小
  int Top;       //栈顶
  int Capacity;  //数组容量大小 
}ST;
void StackInit(ST* p)
{
  assert(p);
  p->a = NULL;
  p->Top = 0;
  p->Capacity = 0;
}
StackType StackTop (ST* p)
{
  assert(p);
  return p->a[p->Top - 1];
}
void StackPush(ST* p, StackType x)
{
  assert(p);
  if (p->Top==p->Capacity)
  {
    int NewCapacity = p->Capacity == 0 ? 4: p->Capacity * 2;
    StackType* Tmp = realloc(p->a,NewCapacity*sizeof(StackType));
    if (Tmp==NULL)
    {
      perror("StackPush realloc");
    }
    else
    {
        p->Capacity = NewCapacity;
      p->a = Tmp;
    }
  }
  p->a[p->Top] = x;
  p->Top++;
}
void StackPop(ST* p)
{
  assert(p);
  assert(p->Top > 0);
  p->Top--;
}
void StackPrint(ST* p)
{
  assert(p);
  while (p->Top>0)
  {
    printf("%d  ", p->a[p->Top - 1]);
    StackPop(p);
  }
}
int StackSize(ST* p)
{
  assert(p);
  return p->Top;
}
bool StackEmpty(ST* p)
{
  assert(p);
  return p->Top==0;
}
void StackDestroy(ST* p)
{
  assert(p);
  free(p->a);
  p->a == NULL;
  p->Capacity = 0;
  p->Top = 0;
}
ST st1;
bool isValid(char * s)
{
    StackInit(&st1);
    while(*s)
    {
        if(*s=='('||*s=='{'||*s=='[')
        {
            StackPush(&st1,*s);
            s++;
        }
        else
        {
            StackType top = StackTop(&st1);
            StackPop(&st1);
            if((*s==')'&& top!='(')
            || (*s==']'&& top!='[')
            || (*s=='}'&& top!='{')
            )
            {
                StackDestroy(&st1);
                return false;
            }
            else
            {
                s++;
            }
        }
    }
    StackDestroy(&st1);
    return true;
}


我们提交试试看


ac1df7fe55be492ba9087ad060a14026.png


咦 我们可以发现 这里好像没有匹配成功过 直接遍历完了也返回true了


那么这里我们可以判断下是否为空 如果为空我们返回假就好了


我们再测试下看看


ac1df7fe55be492ba9087ad060a14026.png


咦 有出错了


我们发现 这里栈上还没有数据 直接就开始出栈了 当然就报错了


那么我们再打个补丁

d3815509a33945519ff9fa162b8408f6.png



咦 有出错了


我们发现 这里栈上还没有数据 直接就开始出栈了 当然就报错了


那么我们再打个补丁


            // 如果遇到了后面的括号 且栈为空 直接return false
            if(StackEmpty(&st1))
            {
                return false;
            }

之后我们再试试看

1b444cefe7a04aa69f025260dce14726.png



成功通过所有测试用例


相关文章
|
6月前
刷爆leetcode第一期
刷爆leetcode第一期
27 1
|
6月前
刷爆leetcode第六期
刷爆leetcode第六期
20 0
|
6月前
刷爆leetcode第七期
刷爆leetcode第七期
25 0
|
6月前
|
测试技术 C语言
刷爆leetcode第五期
刷爆leetcode第五期
29 0
|
6月前
|
索引
刷爆leetcode第四期
刷爆leetcode第四期
22 0
|
6月前
刷爆leetcode第八期
刷爆leetcode第八期
18 0
|
6月前
|
索引
刷爆leetcode第三期
刷爆leetcode第三期
31 0
|
6月前
刷爆leetcode第二期
刷爆leetcode第二期
31 0
|
算法 测试技术
刷爆 LeetCode 双周赛 100,单方面宣布第一题最难
上周末是 LeetCode 第 100 场双周赛,你参加了吗?这场周赛整体没有 Hard 题,但是也没有 Easy 题。第一题国服前百名里超过一半人 wa,很少见。
132 0
刷爆leetcode第七期 0018
刷爆leetcode第七期 0018
115 0
刷爆leetcode第七期 0018