/*
 * @lc app=leetcode.cn id=20 lang=c
 *
 * [20] 有效的括号
 *
 * https://leetcode-cn.com/problems/valid-parentheses/description/
 *
 * algorithms
 * Easy (36.53%)
 * Total Accepted:    49.8K
 * Total Submissions: 136K
 * Testcase Example:  '"()"'
 *
 * 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
 * 
 * 有效字符串需满足:
 * 
 * 
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 
 * 
 * 注意空字符串可被认为是有效字符串。
 * 
 * 示例 1:
 * 
 * 输入: "()"
 * 输出: true
 * 
 * 
 * 示例 2:
 * 
 * 输入: "()[]{}"
 * 输出: true
 * 
 * 
 * 示例 3:
 * 
 * 输入: "(]"
 * 输出: false
 * 
 * 
 * 示例 4:
 * 
 * 输入: "([)]"
 * 输出: false
 * 
 * 
 * 示例 5:
 * 
 * 输入: "{[]}"
 * 输出: true
 * 
 */
bool isValid(char* s) {
    if(*s==NULL){
        return true;
    }
    int flag = 0;
    char a[10000];
    int top,i;
    char temp;
    // 初始化一个栈
    top = 0;
    for(i=0;i<strlen(s);i++){
        if(s[i]=='['){ // 如果是左括号直接入栈
            a[++top]=s[i];
            continue;
        }
        if(s[i]==']'){ // 如果是右括号,则尝试匹配
            temp = a[top];
            if(temp=='['){
                flag = 1;
                top--;
                continue;
            }else{
                flag = 0;
                break;
            }
        }

        if(s[i]=='('){ // 如果是左括号直接入栈
            a[++top]=s[i];
            continue;
        }
        if(s[i]==')'){ // 如果是右括号,则尝试匹配
            temp = a[top];
            if(temp=='('){
                flag = 1;
                top--;
                continue;
            }else{
                flag = 0;
                break;
            }
        }
        if(s[i]=='{'){ // 如果是左括号直接入栈
            a[++top]=s[i];
            continue;
        }
        if(s[i]=='}'){ // 如果是右括号,则尝试匹配
            temp = a[top];
            if(temp=='{'){
                flag = 1;
                top--;
                continue;
            }else{
                flag = 0;
                break;
            }
        }

    }
    if(flag&&(top==0)){
        return true;
    }else{
        return false;
    }
}

如果是空的话,返回true。创建一个栈,top为栈内移动指针,如果是左括号,则存入栈中,top加一,如果是右括号,则和当前的栈顶元素进行匹配。匹配若成功,则top减一。匹配若不成功,则flag=0,直接跳出循环。

最后判断flag是否等于一,并且栈顶指针top是否为0(证明所有左括号都被匹配过)

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

python:

#
# @lc app=leetcode.cn id=20 lang=python3
#
# [20] 有效的括号
#
# https://leetcode-cn.com/problems/valid-parentheses/description/
#
# algorithms
# Easy (36.53%)
# Total Accepted:    49.8K
# Total Submissions: 136K
# Testcase Example:  '"()"'
#
# 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
# 
# 有效字符串需满足:
# 
# 
# 左括号必须用相同类型的右括号闭合。
# 左括号必须以正确的顺序闭合。
# 
# 
# 注意空字符串可被认为是有效字符串。
# 
# 示例 1:
# 
# 输入: "()"
# 输出: true
# 
# 
# 示例 2:
# 
# 输入: "()[]{}"
# 输出: true
# 
# 
# 示例 3:
# 
# 输入: "(]"
# 输出: false
# 
# 
# 示例 4:
# 
# 输入: "([)]"
# 输出: false
# 
# 
# 示例 5:
# 
# 输入: "{[]}"
# 输出: true
# 
#
class Solution:
    def isValid(self, s: str) -> bool:
        
        stack=[]                            #设置一个列表,把该列表当做栈来使用即可。
        dic={')':'(','}':'{',']':'['}       #使用字典存储括号,并且右括号为key,左括号为value
        for char in s:
            if char in dic.values():        #左括号就入栈
                stack.append(char)
            elif char in dic.keys():        #有右括号的话就进行比较,
                if stack==[] or dic[char] != stack.pop():
                    return False
            else:
                return False                #不再字典中的输入直接输出错误

        return stack==[]                    #如果栈最后是空的,那么则符合要求,输出true,如果不是,则输出false,使用一个条件表达式