学渣带你刷Leetcode0020有效的括号

题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

白话题目:

输入括号,按照规则输出括号是否匹配,不能穿插,没有其他输入。

算法:

学过数据结构的小伙伴们会首先想到用栈,类似于见到左括号入栈,右括号出栈,最后栈为空就算匹配了,中间有不匹配的地方就返回false就OK了。

但是请记住,数据就够是一种思想,有些题不用自己费尽的去实现所有的数据结构进行push和pop的实现,下面请看用动态数组模拟就好。

详细解释关注 B站  【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB

C语言完全代码

#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#include<string.h>
bool isValid(char * s)
{
    if (s == NULL || s[0] == '\0') //字符串为空,算是匹配
        return true;
    char *stack = (char*)malloc(strlen(s)+1);
    int top =0;
    int i;
    for ( i = 0; s[i]!='\0';i++)
    {
        if (s[i] == '(' || s[i] == '[' || s[i] == '{')
            stack[top++] = s[i];   //所谓的入栈
        else    //当遇见右边的时候
        {
            if ((--top) < 0)
                return false;//先减减,让top指向栈顶元素
            if (s[i] == ')' && stack[top] != '(')    //看栈顶元素和输入匹配否
                return false;
            if (s[i] == ']' && stack[top] != '[')
                return false;
            if (s[i] == '}' && stack[top] != '{')
                return false;
        }
    }
    //都匹配上了就都弹出栈了,   top=0,非0就是1
   return (!top);//
}

int main()
{
    printf("输入字符串s\n");
    char  *s;
    s=(char *)malloc(sizeof(char));
    gets(s);

    bool result=isValid(s);
    printf("%d\n",result);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章