LeetCode——有效的括号

简介: LeetCode——有效的括号


这里,我提供一种用栈来解决的方法:

思路:栈的结构是先进后出,这样我们就可以模拟栈结构了,如果是‘(’、‘{’、‘[’任何一种,直接push进栈就可以了,如果是‘}’、‘)’、‘]’任何一种就开始判断,看栈pop的是否和对应的字符匹配。


下面是源码:

typedef char STDateType;
typedef struct Stack
{
  STDateType* a;
  int top;
  int capacity;
}Stack;
void StackInit(Stack* ps);
void StackPush(Stack* ps, STDateType x);
void StackPop(Stack* ps);
STDateType StackTop(Stack* ps);
int StackSize(Stack* ps);
bool StackEmpty(Stack* ps);
void StackDestroy(Stack* ps);
void StackInit(Stack* ps)
{
  assert(ps);
  ps->a = NULL;
  ps->capacity = ps->top = 0;
}
void StackPush(Stack* ps, STDateType x)
{
  assert(ps);
  if (ps->top == ps->capacity)
  {
    int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
    STDateType* tmp = (STDateType*)realloc(ps->a, sizeof(STDateType) * newcapacity);
    if (tmp == NULL)
    {
      perror("realloc fail");
      exit(-1);
    }
    ps->a = tmp;
    ps->capacity = newcapacity;
  }
  ps->a[ps->top] = x;
  ps->top++;
}
void StackPop(Stack* ps)
{
  assert(ps);
  --ps->top;
}
STDateType StackTop(Stack* ps)
{
  assert(ps);
  return ps->a[ps->top - 1];
}
int StackSize(Stack* ps)
{
  assert(ps);
  return ps->top;
}
bool StackEmpty(Stack* ps)
{
  assert(ps);
  return ps->top == 0;
}
void StackDestroy(Stack* ps)
{
  assert(ps);
  free(ps->a);
  ps->a = NULL;
  ps->top = ps->capacity = 0;
}
bool isValid(char * s){
    Stack st;
    StackInit(&st);
    char top;
    while(*s)
    {
        if((*s == '(') || (*s == '[') || (*s == '{'))
        {
            StackPush(&st,*s);
        }else
        {
            if(StackEmpty(&st))
            {
                StackDestroy(&st);
                return false;
            }
          top = StackTop(&st);
          StackPop(&st);
          if((*s == ']' && top != '[')
          || (*s == '}' && top != '{')
          || (*s == ')' && top != '('))
          {
              StackPop(&st);
              StackDestroy(&st);
              return false;   
          }
        }
        ++s;
    }
    bool ret = StackEmpty(&st);
    StackDestroy(&st);
    return ret;
}   


相关文章
|
2月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
2月前
leetcode-301:删除无效的括号
leetcode-301:删除无效的括号
28 0
|
25天前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
17 1
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
21天前
|
SQL 算法 数据可视化
LeetCode 题目 32:最长有效括号【python】
LeetCode 题目 32:最长有效括号【python】
|
21天前
|
存储 SQL 算法
LeetCode第22题:生成括号【22/1000 python 递归|动态规划】
LeetCode第22题:生成括号【22/1000 python 递归|动态规划】
|
21天前
|
SQL 算法 数据挖掘
探索有效括号 力扣第20题:从栈到递归的多角度解法 【含图解 python】
探索有效括号 力扣第20题:从栈到递归的多角度解法 【含图解 python】
LeetCode | 20. 有效的括号
LeetCode | 20. 有效的括号
|
2月前
leetcode代码记录(有效的括号
leetcode代码记录(有效的括号
18 1