SCAU 18933 括号匹配问题

在这里插入图片描述
在这里插入图片描述
裸的括号匹配,遇到左括号时将其压进栈,遇到右括号判断是否空栈,空栈则不合法,非空栈则退栈。这里多个记录下标的步骤,再开数组记录一下非法括号的下标即可。
(有点坑的是输出第二行原来字符串时要输出空格,不能不输出,审题的重要性~,我用vector模拟栈,本质一样的

//
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(x,y) memset(x,y,sizeof(x))
#define all(v) v.begin() , v.end()
#define pb(v) push_back(v)
#define INF 0x3f3f3f3f
#define int long long
#define lson p*2,l,mid
#define rson p*2+1,mid+1,r
//#define int long long
typedef long long ll;
char s[205];
char res[205];
vector <int  > ans;
signed main()
{
    //!!!!!!!!!!!!!!!!!!!!!!
//    freopen("data.txt","r",stdin);
    //!!!!!!!!!!!!!!!!!!!!!!
//    IOS;
    while( cin>>(s+1) )
    {
        cout<<(s+1)<<endl;
        int cnt=0;
        int len = strlen(s+1);
        _for(i,1,len)
        {
            if( s[i] == '(') ans.pb(i);
            else if( s[i] == ')')
            {
                if( !ans.empty())//有左括号就退栈
                {
                    ans.pop_back();
                }
                else//当前右括号无法匹配
                {
                    res[i] = '?';
                }
            }
        }
        //处理栈里剩余左括号
        while( !ans.empty() )
        {
            int x = ans.back();
            res[x] = '$';
            ans.pop_back();
        }
        _for(i,1,len)
        if(res[i]) cout<<res[i];
        else cout<<" ";
        cout<<endl;
	//多case要清空原来的存储
        mst(s,0);
        mst(res,0);
        ans.clear();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值