scau 18933 括号匹配问题

本文详细解析了一种使用栈来解决括号匹配问题的方法。通过输入包含括号的字符串,程序能够标识出所有未正确匹配的括号,并用特定符号进行标记。文章还分享了在实现过程中的常见错误及解决方案。

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

 //这道题困扰了我很久,老师上课打过一次代码,我记不全了,就靠记住的那一点小片段,然后不停地补充。

//首先,字符数组c是我要输入的,然后字符数组ans初始化为空格,再定义一个整形数组s(数组s用于记录左括号的位置)【在定义变量时要养成一个初始化的习惯,有的时候会因此发生错误哦】这道题用了栈来解决。当读到一个左括号“(”时,就入栈,top指针加一;如果读到了右括号“)”,先判断top指针是否为0,如果top==0,说明该右括号前没有左括号,那么数组ans就在该右括号的位置上存一个“?”,如果top不等于0,说明这个栈里面有左括号,那么他们就是匹配的,则把栈中的左括号拿出来,一直循环。当输入完后,我们就需要检查栈里还有没有左括号(这个栈只存了左括号),如何检查?看top是否等于0就好了。在栈中查找元素时,top指针要先自减一,循环条件为top>=0,数组s里存的是左括号的位置(也就是左括号在字符数组c中的下标),当top>=0时说明还有未匹配的左括号,根据数组s中存的位置(即下标),用ans数组存上一个“$”。到这里,括号匹配已经完成,未匹配的已经做上了标记,最后一步就是遍历数组ans。

//下面是全部代码

另:for(c;cin>>c;)和while(cin>>c)和while(scanf("%s",c)!=EOF)都是读入多组数据的方法,用哪个都可以

然后这道题在我试了多组样例后均能得出正确结果,但是oj上过不了!!!为什么!!因为我少输出了!!!仔细看oj上的输出样例,输入字符串后还应该再输出一次原字符串!就是这个问题,我找了好久都没想到!所以做题的时候一定要仔细看输出要求!

#include <iostream>
#include <malloc.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define OK 1
#define ERROR 0
using namespace std;
char c[100];
int main()
{
    //for(c;cin >>c;)
    //while(cin >> c)
    while(scanf("%s",c)!=EOF)//读多组数据
    {
        cout << c << endl;//划重点!仔细看输出样例!在输入字符串后还要再输出一次字符串!
        int s[100];
        char ans[100]={' '};
        int i,top=0,n;
        n=strlen(c);//长度
        for(i=0;i<n;i++)
        {
            if(c[i]=='(')//遇到左括号
            {
                s[top++]=i;//把左括号的位置写进数组s
            }
            else if(c[i]==')')//遇到右括号
            {
                if(top==0)//如果栈顶指针为0,说明这个右括号不匹配
                    ans[i]='?';//数组ans存一个问号
                else
                    top--;//否则,它有匹配的左括号,将左括号出栈
            }
        }
        top=top-1;//栈顶指针先减一
        while(top>=0)
        {
            int x=s[top];//数组s存的是不匹配的左括号的位置
            ans[x]='$';//不匹配的左括号的位置上存一个$
            top--;//栈顶指针减一
        }
        //printf("%s\n",c);
        for(i=0;i<n;i++)
        {
            if(ans[i])
                cout<<ans[i];
            else
                cout<<' ';
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值