括号匹配(C++)

部署运行你感兴趣的模型镜像

method 1: 栈

遍历字符串

遇到左括号就压栈;遇到右括号,若栈不为空,就将栈顶的左括号取出,匹配返回一个bool值。

若直至遍历结束都没有发生错误栈为空,则匹配成功。

(()){}

(qw){[]}

#include<iostream>
#include<stack>

using namespace std;

bool left(char s) {
    return s=='(' || s=='{' || s=='[';
}
bool right(char s) {
    return s==')' || s=='}' || s==']';
}
bool check(char a,char b) {
    return (a=='(' && b==')') || (a=='{' && b=='}') || (a=='[' && b==']');
}

bool match(string s)
{
    stack<char> p;
    for(int i=0; i<s.size(); i++)
    {
       if(left(s[i])) {
           p.push(s[i]);
       }else if(right(s[i])) {
           if(!p.empty() && check(p.top(),s[i])) { //栈不空,且匹配正确
               p.pop();
           } else {
               return false; //不匹配,直接返回false
           }
       }

    }
    if(!p.empty()) return false; //栈不空,说明存在没有匹配的左括号,返回false
    return true; //全都匹配成功
}

-------

针对只有'('、')'的情况

顺序遍历,计数匹配

顺序遍历。遇到左括号,count+1;遇到右括号,count-1。过程中出现count<0,返回false。最终 return count==0

bool isValid(string s)
{
    int count = 0;
    for(auto & e : s) {
        if(e == '(') {
            count++;
        } else if(e == ')') {
            count--;
            if(count < 0) {
                return false;
            }
        }
    }
    return count==0;
}

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

<think>我们参考上述引用中关于括号匹配的实现思路,特别是引用[2]和引用[4]中的算法描述。 核心思想:使用栈数据结构,遍历字符串: 1. 遇到左括号('(', '[', '{')则入栈。 2. 遇到右括号(')', ']', '}')则检查栈顶元素是否与之匹配: - 如果栈为空,说明没有匹配的左括号(错误类型3)。 - 如果栈顶元素不匹配,说明左右括号类型不匹配(错误类型1)。 - 如果匹配,则弹出栈顶元素。 3. 遍历结束后,如果栈非空,说明有未匹配的左括号(错误类型2)。 根据题目要求,我们需要返回三种错误类型: 类型1:左右括号不匹配(如"(]") -> 返回1 类型2:有左括号没有匹配的右括号(如"(([]")-> 返回2 类型3:有右括号没有匹配的左括号(如")")-> 返回3 注意:题目要求如果匹配则返回0。 另外,引用[3]中提供了一段代码,但其中有一些问题,比如在遇到右括号时循环3次检查,实际上不需要循环,因为每个右括号只对应一种类型。我们采用更直接的方法。 步骤: 1. 创建一个栈(这里使用C++的stack<char>)。 2. 遍历字符串中的每个字符。 3. 如果是左括号,入栈。 4. 如果是右括号: a. 检查栈是否为空,如果为空,则返回3(类型3)。 b. 栈不为空,则取出栈顶元素,检查是否匹配: - 匹配则弹出栈顶,继续。 - 不匹配则返回1(类型1)。 5. 遍历结束后,如果栈不为空,则返回2(类型2);否则返回0(匹配)。 注意:题目中表达式可能包含其他字符(字母、数字、运算符等),我们忽略这些字符。 我们实现一个函数,输入为字符串表达式,输出为整数(0,1,2,3)。 具体代码实现如下: </think>以下是实现表达式括号匹配C++代码,基于栈数据结构实现: ```cpp #include <iostream> #include <stack> #include <string> using namespace std; int checkBracketMatching(const string& expr) { stack<char> s; for (char c : expr) { // 忽略非括号字符 if (c != '(' && c != ')' && c != '[' && c != ']' && c != '{' && c != '}') { continue; } // 处理左括号 if (c == '(' || c == '[' || c == '{') { s.push(c); } // 处理右括号 else { if (s.empty()) { return 3; // 栈空遇到右括号(错误类型3) } char top = s.top(); s.pop(); // 检查括号类型是否匹配 if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) { return 1; // 左右括号类型不匹配(错误类型1) } } } return s.empty() ? 0 : 2; // 栈非空表示有未匹配左括号(错误类型2) } int main() { string expression; cout << "请输入表达式: "; getline(cin, expression); int result = checkBracketMatching(expression); switch (result) { case 0: cout << "括号匹配正确"; break; case 1: cout << "错误类型1:左右括号类型不匹配"; break; case 2: cout << "错误类型2:存在未闭合的左括号"; break; case 3: cout << "错误类型3:存在未匹配的右括号"; break; } return 0; } ``` ### 代码说明: 1. **核心数据结构**: - 使用`stack<char>`存储遇到的左括号 - 时间复杂度:$O(n)$(单次遍历表达式) - 空间复杂度:$O(n)$(最坏情况全为左括号) 2. **匹配逻辑**: - 遇到左括号 `(`, `[`, `{` 时入栈 - 遇到右括号 `)`, `]`, `}` 时: - 栈空 → 错误类型3(返回3) - 栈顶不匹配 → 错误类型1(返回1) - 匹配则弹出栈顶 - 遍历结束后栈非空 → 错误类型2(返回2) 3. **错误处理类型**: - `0`:完全匹配 - `1`:类型不匹配(如`(]`) - `2`:左括号未闭合(如`((`) - `3`:右括号未匹配(如`)`) 4. **特殊处理**: - 忽略非括号字符(字母、数字、运算符等) - 支持三种括号类型 `()`, `[]`, `{}` 的混合匹配 此实现参考了栈在表达式处理中的经典应用[^2][^4],能正确处理如 `let {x=a[0]*(b+c); y=b}` 等包含混合括号的复杂表达式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值