【C 语言】用 C 语言解决括号问题

本文深入探讨了如何通过栈数据结构解决括号匹配问题,详细解释了算法的实现过程,包括如何判断一个包含多种括号的字符串是否有效,以及如何处理空字符串的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

范例1:

输入:{}
输出:true

范例2:

输入:({)
输出:false

解题思路:

我们可以将问题简化为一个简单一些的子问题:每当我们在表达式中遇到一对匹配的括号时,我们就从表达式中删除它。然后对问题在递归处理。但是因为我们对整体结构一无所知,所以,我们无法真正地从内到外处理这个问题。

 于是,我们可以利用栈后进先出的性质。我们将表达式遍历,每当读入一个左括号,则将其直接入栈,等待与其相匹配的右括号出现;若读入的是右括号,则判断栈顶元素是否是其相匹配的左括号,如果是匹配的话,则将栈顶元素出栈。否则,该表达式不合法。遍历完毕后,如果栈中还存在等待匹配的括号,则说明表达式不合法。

struct Stack{
    //定义栈的存储结构
    char str[10000];
    int top;  //表示栈顶元素的下标,初始为-1
};

bool isValid(char * s){
    struct Stack stacks;
    stacks.top=-1;
    int i=0;
    if(s==NULL){
        return true;
    }else{
        if(s[0]==')'||s[0]==']'||s[0]=='}'){
            //如果第一个元素就是右括号则直接返回false
            return false;
        }
        while(s[i]!='\0'){
            if(s[i]=='('||s[i]=='{'||s[i]=='['){
                //若当前元素为左括号,则压栈
                stacks.top++;
                stacks.str[stacks.top]=s[i];
            }else{
                if(stacks.top==-1){
                    //若当前元素不为左括号且栈为空则返回false
                    return false;
                }else{
                    if((stacks.str[stacks.top]=='(' &&s[i]==')')||(stacks.str[stacks.top]=='{'&& s[i]=='}')
                       ||(stacks.str[stacks.top]=='[' && s[i]==']')){
                        //如果当前元素能够和栈顶元素配对,则将栈顶元素出栈,反之返回false
                        stacks.top--;
                    }else{
                           return false;
                    }
                }
            }
            
            i++;
        }
        if(stacks.top!=-1){
            //若将元素全部遍历后,栈中仍还有元素说明并未全部匹配则返回false
            return false;
        }
    }
    return true;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值