栈的应用之括号的匹配

本文探讨了如何使用栈来解决括号匹配问题,详细分析了括号匹配的过程,通过设立栈来处理括号,遇到右括号时弹出栈顶括号进行匹配,左括号则压栈。算法开始和结束时栈应为空。

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

题目:假设表达式中允许包含三种括号:圆括号、方括号、花括号,其嵌套的顺序随意。
例题如下:

    char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确
    char b[] = "(()))abc{[]}"; // 右括号多于左括号
    char c[] = "(()()abc{[]}"; // 左括号多于右括号
    char d[] = "(())abc{[]()}"; // 左右括号匹配正确

分析过程(就按({} [])来分析):
当计算机接受了第一个“(”括号后,它期待与之相匹配的“)”括号出现,结果等来的是“{”括号,此时第一个括号“(”只能靠边,而迫切等待与第二个括号相匹配的“}”出现,但等到了“[”,这时最迫切的等待匹配的就成了“]”。在第三个括号等到他匹配的之后,就会让位与第二个括号,……,以此类推,可见这个处理过程恰好与栈的特点相吻合。
So,在算法中设置一个栈,,每读入一个括号,若是右括号,则将栈顶的括号pop弹出与之匹配。要不是则继续push压栈。另外,在算法的开始和结束时,栈都应该是空的。

   下面我们来看一下具体代码:
#include<iostream>
using namespace std;
#include<stack>
#include<assert.h>

//是否是括号
bool IsBrackets(char ch)
{
    if(ch=='(' || ch==')' || ch=='[' || ch==']' || ch=='{' || ch=='}')
    {
        return true;
    }
    return false;
}

bool MatchBrackets(char* pStr)
{
    //1.断言
    assert(pStr);
    //2.求长度
    int len = strlen(pStr);

    stack<char> s;

    for(int i=0; i<len; i++)
    {
        //
        if(!IsBrackets(pStr[i]))
        {
            continue;
        }
        else
        {
            //左括号入栈
            if(pStr[i]=='(' || pStr[i]=='[' || pStr[i]=='{')
            {
                s.push(pStr[i]);
            }
            else //右括号
            {
                //判断栈是否为空
                if(s.empty())
                {
                    cout<<"右括号多于左括号"<<endl;
                    return false;
                }
                //不为空
                if(pStr[i]==')'&&s.top()=='(' || pStr[i]==']'&&s.top()=='[' || pStr[i]=='}'&&s.top()=='{')
                {
                    s.pop();
                }
                else
                {
                    cout<<"左右括号次序不匹配"<<endl;
                    return false;
                }
            }
        }
    }

    if(!s.empty())
    {
        cout<<"左括号多于右括号"<<endl;
        return false;
    }
    cout << "左右括号匹配正确" << endl;
    return true;
}

void Test()
{
    char a[] = "(())abc{[(])}"; // 左右括号次序匹配不正确
    char b[] = "(()))abc{[]}"; // 右括号多于左括号
    char c[] = "(()()abc{[]}"; // 左括号多于右括号
    char d[] = "(())abc{[]()}"; // 左右括号匹配正确
    cout << MatchBrackets(a) << endl;
    cout << MatchBrackets(b) << endl;
    cout << MatchBrackets(c) << endl;
    cout << MatchBrackets(d) << endl;
}

int main()
{
    Test();
    return 0;
}

简单写到这,期待和你的交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值